diff options
Diffstat (limited to 'html_server')
-rw-r--r-- | html_server/html_server.py | 257 | ||||
-rw-r--r-- | html_server/static/base.css | 46 | ||||
-rw-r--r-- | html_server/static/check_err.js | 4 | ||||
-rw-r--r-- | html_server/templates/base.html | 63 | ||||
-rw-r--r-- | html_server/templates/property_info.html | 6 | ||||
-rw-r--r-- | html_server/templates/registers/table_scripts.html | 8 |
6 files changed, 204 insertions, 180 deletions
diff --git a/html_server/html_server.py b/html_server/html_server.py index 0d4bca8..22194cd 100644 --- a/html_server/html_server.py +++ b/html_server/html_server.py @@ -1,6 +1,10 @@ -import pcipywrap import json -from optparse import OptionParser + +from optparse import OptionParser, OptionGroup +from multiprocessing import Process + +import requests +from api_server import ApiServer #import flask elements from flask import render_template @@ -9,140 +13,107 @@ from flask import request from flask import url_for from flask import redirect from flask import send_from_directory +from flask import make_response app = Flask(__name__) -pcilib = 0; -device = '/dev/fpga0' -model = '' +api_server_port = 9000 +api_server_host = '0.0.0.0' -# property json api -@app.route("/property_info_json") -def get_property_list_json(): - branch = request.args.get('branch') - if not branch is None: - branch = str(branch) +@app.route("/json/<command>") +def process_json_command(command): + headers = {'content-type': 'application/json'} + message = {'command': command} - prop_info = 0 - try: - prop_info = pcilib.get_property_list(branch) - return json.dumps(prop_info) - except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/get_property_json') -def get_property_json(): - prop = request.args.get('prop') - - try: - val = pcilib.get_property(str(prop)) - return json.dumps({'value': val}) - except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/set_property_json') -def set_property_json(): - val = request.args.get('val') - prop = request.args.get('prop') - - try: - pcilib.set_property(float(val), str(prop)) - return json.dumps({'status': 'ok'}) - except Exception as e: - return json.dumps({'error': str(e)}) + for arg in request.args: + message[arg] = request.args[arg] -# register json api -@app.route("/registers_list_json") -def get_registers_list_json(): - reg_list = 0 + r = 0; try: - reg_list = pcilib.get_registers_list() - return json.dumps(reg_list) + r = requests.get('http://' + api_server_host + ':' + str(api_server_port), + data=json.dumps(message), + headers=headers) except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/read_register_json') -def read_register_json(): - name = request.args.get('name') - bank = request.args.get('bank') + return str(json.dumps({'status':'error', 'description': e})) - try: - value = pcilib.read_register(str(name), str(bank)) - return json.dumps({'value': value}) - except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/write_register_json') -def write_register_json(): - val = request.args.get('val') - name = request.args.get('name') - bank = request.args.get('bank') - - try: - pcilib.write_register(float(val), str(name), str(bank)) - return json.dumps({'status': 'ok'}) - except Exception as e: - return json.dumps({'error': str(e)}) + #application/octet-stream + response = make_response(r.content) + for header in r.headers: + response.headers[header] = r.headers[header] + + return response #html api -@app.route('/set_property') -def set_property(): - val = request.args.get('val') - prop = request.args.get('prop') - - try: - pcilib.set_property(float(val), str(prop)) - return redirect(url_for('get_property_list', branch=prop)) - except Exception as e: - return str(e) - -@app.route('/write_register') -def write_register(): - val = request.args.get('val') - name = request.args.get('name') - bank = request.args.get('bank') - - try: - pcilib.write_register(float(val), str(name), str(bank)) - return redirect(url_for('get_register_info', name=name, bank=bank)) - except Exception as e: - return str(e) - @app.route('/register_info') def get_register_info(): + #get parameters name = request.args.get('name') bank = request.args.get('bank') + #load register info reg_info = 0 value = dict() try: - reg_info = pcilib.get_register_info(str(name), str(bank)) - value[name] = pcilib.read_register(str(name), str(bank)) + r = requests.get(url_for('process_json_command', + command = 'get_register_info', + bank = bank, + reg = name, _external = True)) + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + + reg_info = r.json()['register'] + + #get register value + r = requests.get(url_for('process_json_command', + command = 'read_register', + bank = bank, + reg = name, _external = True)) + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + + value[name] = r.json()['value'] except Exception as e: return str(e) + return render_template('register_info.html', register=reg_info, value=value) @app.route("/registers_list") def get_registers_list(): + #get parameters bank = request.args.get('bank') if not bank is None: bank = str(bank) - - reg_list = 0 + + #load registers list + reg_list = [] try: - reg_list = pcilib.get_registers_list(bank) + r = requests.get(url_for('process_json_command', + command = 'get_registers_list', + bank = bank, _external = True)) + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + reg_list = r.json()['registers'] except Exception as e: return str(e) + #get register values value = dict() for reg in reg_list: try: - value[reg['name']] = pcilib.read_register(str(reg['name']), - str(reg['bank'])) + r = requests.get(url_for('process_json_command', + command = 'read_register', + bank = str(reg['bank']), + reg = str(reg['name']), _external = True)) + if(r.json().get('status') == 'error'): + value[reg['name']] = 'Error: ' + r.json()['description'] + else: + value[reg['name']] = r.json()['value'] + except Exception as e: - value[reg['name']] = str(e) + value[reg['name']] = 'Error: ' + str(e) + #render result return render_template('registers_list.html', registers = reg_list, render_template = render_template, @@ -151,30 +122,40 @@ def get_registers_list(): @app.route("/property_info") def get_property_list(): + #get parameters branch = request.args.get('branch') if not branch is None: branch = str(branch) - prop_info = 0 + #get properties info + prop_info = 0 try: - prop_info = pcilib.get_property_list(branch) + r = requests.get(url_for('process_json_command', + command = 'get_property_list', + branch = branch, _external = True)) + + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + + prop_info = r.json()['properties'] + except Exception as e: return str(e) value = dict() - if (len(prop_info) == 1) and not ('childs' in (prop_info[0])['flags']): + for prop in prop_info: try: - branch = (prop_info[0])['path'] - value[branch] = pcilib.get_property(branch) + path = prop['path'] + r = requests.get(url_for('process_json_command', + command = 'get_property', + prop = path, _external = True)) + if(r.json().get('status') == 'error'): + value[path] = 'Error: ' + r.json()['description'] + else: + value[path] = r.json()['value'] + except Exception as e: - return str(e) - else: - for prop in prop_info: - try: - path = prop['path'] - value[path] = pcilib.get_property(path) - except Exception as e: - value[path] = str(e) + value[path] = str(e) return render_template('property_info.html', value = value, @@ -195,12 +176,32 @@ if __name__ == "__main__": parser.add_option("-p", "--port", action="store", type="int", dest="port", default=5000, help="Set server port (5000)") - parser.add_option("-d", "--device", action="store", - type="string", dest="device", default=str('/dev/fpga0'), - help="FPGA device (/dev/fpga0)") - parser.add_option("-m", "--model", action="store", - type="string", dest="model", default=None, - help="Memory model (autodetected)") + + pcilib_group = OptionGroup(parser, "Api server", + "Api server options group") + pcilib_group.add_option("-e", "--external", action="store_true", + dest="external_api_server", + default=False, + help="Dont start own api server. Use external" + " server instead"); + pcilib_group.add_option("--api-server-host", action="store", + type="string", dest="api_server_host", + default='0.0.0.0', + help="Api server ip adress (0.0.0.0)") + pcilib_group.add_option("--api-server-port", action="store", + type="int", dest="api_server_port", + default=9000, + help="Api server port (9000)") + pcilib_group.add_option("-d", "--device", action="store", + type="string", dest="device", + default=str('/dev/fpga0'), + help="FPGA device (/dev/fpga0)") + pcilib_group.add_option("-m", "--model", action="store", + type="string", dest="model", default=None, + help="Memory model (autodetected)") + + parser.add_option_group(pcilib_group) + opts = parser.parse_args()[0] HOST_NAME = '0.0.0.0' @@ -209,6 +210,22 @@ if __name__ == "__main__": device = opts.device model = opts.model - pcilib = pcipywrap.Pcipywrap(device, model) - pcipywrap.__redirect_logs_to_exeption() - app.run(host = HOST_NAME, port = PORT_NUMBER, threaded=True) + #start api server in separate process + api_server_host = opts.api_server_host + api_server_port = opts.api_server_port + if(not opts.external_api_server): + api_server = ApiServer(device, model, (api_server_host, api_server_port)) + def serve_forever(server): + try: + server.serve_forever() + except KeyboardInterrupt: + pass + + Process(target=serve_forever, args=(api_server,)).start() + + #start Flask html server + app.run(host = HOST_NAME, + port = PORT_NUMBER, + threaded=True, + #debug=True + ) diff --git a/html_server/static/base.css b/html_server/static/base.css new file mode 100644 index 0000000..15c2249 --- /dev/null +++ b/html_server/static/base.css @@ -0,0 +1,46 @@ +.tabs > div, .tabs > input { display: none; } + +.tabs label { + padding: 5px; + border: 1px solid #aaa; + line-height: 28px; + cursor: pointer; + position: relative; + bottom: 1px; + background: #fff; +} + +.tabs input[type="radio"]:checked + label { border-bottom: 2px solid #fff; } + +.tabs > input:nth-of-type(1):checked ~ div:nth-of-type(1), +.tabs > input:nth-of-type(2):checked ~ div:nth-of-type(2) { + display: block; + padding: 5px; + border: + 1px solid #aaa; +} +.tree { + height: 85vh; + padding: 5px; + border: 1px solid #aaa; + line-height: 28px; + cursor: pointer; + position: relative; + bottom: 1px; + background: #fff; + overflow:auto; +} + +.infoTable { + padding: 2px; + + border: 1px solid #aaa; + line-height: 28px; + cursor: pointer; + position: relative; + background: #fff; + overflow:auto; + bottom: 1px; + + text-align: left; +} diff --git a/html_server/static/check_err.js b/html_server/static/check_err.js index a63d7bc..66519ea 100644 --- a/html_server/static/check_err.js +++ b/html_server/static/check_err.js @@ -1,4 +1,4 @@ function checkError(json) { - if(json.error) - alert('Error: ' + json.error) + if(json.status === 'error') + alert('Error: ' + json.description) } diff --git a/html_server/templates/base.html b/html_server/templates/base.html index 0e3aea8..a2df1e9 100644 --- a/html_server/templates/base.html +++ b/html_server/templates/base.html @@ -5,6 +5,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='codebase/dhtmlx.css') }}"/> + <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='base.css') }}"/> <script type=text/javascript src="{{ url_for('static', filename='jquery-2.2.1.js') }}"></script> <script src="{{ url_for('static', filename='codebase/dhtmlx.js') }}"></script> <script src="{{ url_for('static', filename='check_err.js') }}"></script> @@ -13,8 +14,8 @@ function createPropertyTree(branch, id) { function getPropertyItemsOnLevel(branch, id) { - pathToProperties = "{{ url_for('get_property_list_json') }}" - completePath = pathToProperties + '?branch=' + branch + var pathToProperties = "{{ url_for('process_json_command', command = 'get_property_list') }}" + var completePath = pathToProperties + '?branch=' + branch $.getJSON(completePath, function(json) { @@ -25,6 +26,9 @@ function parsePropertyItems(json, branch, id) { + checkError(json) + json = json.properties + function loadPropertyInfo(branch) { var pathToProperties = "{{ url_for('get_property_list') }}" @@ -57,6 +61,8 @@ var regTree function createRegistersList() { function parseJsonRegisterList(json) { + checkError(json) + json = json.registers function loadRegistersList(bank) { var pathToGetRegisterList = "{{ url_for('get_registers_list') }}" @@ -129,7 +135,7 @@ } //get registers json list - getRegistersListPath = "{{ url_for('get_registers_list_json') }}" + var getRegistersListPath = "{{ url_for('process_json_command', command = 'get_registers_list') }}" $.getJSON(getRegistersListPath, parseJsonRegisterList); } @@ -152,54 +158,6 @@ <h2>Device {{ device }} model={{ model }} control page </h2> </div> {% endblock %} - <style> - .tabs > div, .tabs > input { display: none; } - - .tabs label { - padding: 5px; - border: 1px solid #aaa; - line-height: 28px; - cursor: pointer; - position: relative; - bottom: 1px; - background: #fff; - } - - .tabs input[type="radio"]:checked + label { border-bottom: 2px solid #fff; } - - .tabs > input:nth-of-type(1):checked ~ div:nth-of-type(1), - .tabs > input:nth-of-type(2):checked ~ div:nth-of-type(2) { - display: block; - padding: 5px; - border: - 1px solid #aaa; - } - .tree { - height: 85vh; - padding: 5px; - border: 1px solid #aaa; - line-height: 28px; - cursor: pointer; - position: relative; - bottom: 1px; - background: #fff; - overflow:auto; - } - - .infoTable { - padding: 2px; - - border: 1px solid #aaa; - line-height: 28px; - cursor: pointer; - position: relative; - background: #fff; - overflow:auto; - bottom: 1px; - - text-align: left; - } - </style> <div class="tabs"> <input type="radio" name="current" checked="checked" id="props_id"/> @@ -229,5 +187,8 @@ </div> {% block content %} {% endblock %} + <div class="block1" > + <a href="{{ url_for('process_json_command', command='help') }}">Json API usage</a> + </div> </body> </html> diff --git a/html_server/templates/property_info.html b/html_server/templates/property_info.html index 4e7c92f..62ea1ba 100644 --- a/html_server/templates/property_info.html +++ b/html_server/templates/property_info.html @@ -7,7 +7,7 @@ <script> function updateProperty(prop) { - var pathToGetProperty = "{{ url_for('get_property_json') }}" + var pathToGetProperty = "{{ url_for('process_json_command', command = 'get_property') }}" var completePath = pathToGetProperty + '?prop=' + prop $.getJSON(completePath, function(json){ @@ -23,9 +23,9 @@ if(value == "") return - var pathToGetProperty = "{{ url_for('set_property_json') }}" + var pathToGetProperty = "{{ url_for('process_json_command', command = 'set_property') }}" var completePath = pathToGetProperty + '?prop=' + prop + - '&val=' + value; + '&value=' + value; $.getJSON(completePath, function(json) { diff --git a/html_server/templates/registers/table_scripts.html b/html_server/templates/registers/table_scripts.html index 017c910..a772b9f 100644 --- a/html_server/templates/registers/table_scripts.html +++ b/html_server/templates/registers/table_scripts.html @@ -13,9 +13,9 @@ */ function updateRegister(bank, name) { - var pathToReadRegister = "{{ url_for('read_register_json') }}" + var pathToReadRegister = "{{ url_for('process_json_command', command = 'read_register') }}" var completePath = pathToReadRegister + '?bank=' + bank + - '&name=' + name + '®=' + name $.getJSON(completePath, function(json){ checkError(json) @@ -29,9 +29,9 @@ if(value == "") return - var pathToReadRegister = "{{ url_for('write_register_json') }}" + var pathToReadRegister = "{{ url_for('process_json_command', command = 'write_register') }}" var completePath = pathToReadRegister + '?bank=' + bank + - '&name=' + name + '&val=' + value; + '®=' + name + '&value=' + value; $.getJSON(completePath, function(json) { |