diff --git a/comm/resolver/README.md b/comm/resolver/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f83c279cda6a03fa9b297c741b9ca0d97ea6c463 --- /dev/null +++ b/comm/resolver/README.md @@ -0,0 +1,29 @@ +DAS2018 ADC クライアント(リゾルバ)プログラム +=== + +DAS2018 アルゴリズムデザインコンテスト用クライアントプログラム + +## Description + +解答データをソルバから受信し,整形した結果をサーバへ返すプログラム. + +## Requirements + +- Python 3.5以上(くらい) +- Flask + +## Usage + +``` +python3 main.py [--port XXXX] [--host XXXX] +``` + +### Options + +
+
-H, --host
+
サーバホストのアドレス (デフォルト:192.168.5.1:5000)
+ +
-p, --port
+
使用するポート (デフォルト:5000)
+
diff --git a/comm/resolver/main.py b/comm/resolver/main.py new file mode 100644 index 0000000000000000000000000000000000000000..44e454a0ff1523ede97da2d7e31e071167862233 --- /dev/null +++ b/comm/resolver/main.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +""" +This script provides a PYNQ client. +This is intended to run on the client server (PYNQ). +""" + +import argparse +import json +import os +import platform +import queue +import requests +import subprocess +import sys +import threading +import time +from flask import Flask, render_template, request, g +from urllib.parse import urlparse + +sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../../solver') +import BoardStr +# import adc2018solver as pynqrouter + +app = Flask(__name__) +args = {} +client_baseurl = "" +resolve_queue = None + +def resolve(): + """ + queueを受け取りそこに入ってきた答えを整形し,ホストに送信します. + """ + global args + global client_baseurl + global resolve_queue + + while True: + if resolve_queue is None: + time.sleep(1) + continue + else: + data = resolve_queue.get() + + if args['verbose']: + print("Processing queued data...") + print(data) + + outpath = "./works/resolved.txt" + probpath = "./problems/{}".format(data['qname']) + tmppath = "./works/answer.txt" + + with open(tmppath, "w") as fp: + fp.write(data['answer']) + + # Resolver + cmd = "/home/pi/adc2017/pynq-router/resolver/solver --reroute --output {} {} {}".format(outpath, probpath, tmppath) + subprocess.call(cmd.strip().split(" ")) + + resolved = "" + with open(outpath, "r") as fp: + resolved = fp.read() + + res = { + 'answer': resolved, + 'solved': True, + 'solver': data['client'], + 'resolver': client_baseurl, + 'client': client_baseurl, + 'cputime': data['cputime'], + 'qname': data['qname'] + } + # 結果をホストに返す + r = requests.post("http://{}/post".format(args['host']), data=res) + + if args['verbose']: + print("Done.") + print(res) + +@app.route('/post', methods=["POST"]) +def start(): + + # global pynq_thread + global args + global client_baseurl + global resolve_queue + + if args["verbose"]: + print(request.form) + + data = { + 'client': request.form['client'], + 'qname': request.form['qname'], + 'answer': request.form['answer'], + 'cputime': request.form['cputime'] + } + + resolve_queue.put(data) + + ans = {"status": "Queued"} + + if args["verbose"]: + print(ans) + + return json.dumps(ans) + +@app.route('/stop') +def stop(): + + global resolve_queue + + if resolve_queue.empty() is None: + ans = {"status": "Nothing queued"} + else: + # pynq_thread.stop() + while not resolve_queue.emtpy(): + resolve_queue.get() + ans = {"status": "Stopped"} + + return json.dumps(ans) + +@app.route("/status") +def status(): + + # global pynq_thread + + res_mes = "" + + if resolve_queue.empty(): + res_mes = "Ready" + else: + res_mes = "Working" + + res = {"status": res_mes} + return json.dumps(res) + +@app.route("/") +def index(): + return platform.node() + +@app.before_request +def before_request(): + global client_baseurl + + _url = request.url + parse = urlparse(_url) + client_baseurl = parse.netloc + +if __name__ == "__main__": + + # Check if this script runs as "root" user + # if os.getuid() != 0: + # raise Exception("Must run as root") + # sys.exit(1) + + parser = argparse.ArgumentParser(description="PYNQ client (for resolver).") + parser.add_argument("-p", "--port", action="store", type=int, default=5000, help="Port") + parser.add_argument("-H", "--host", action="store", type=str, default="192.168.5.1:5000", help="Host address") + parser.add_argument("--debug", action="store_true", default=False, help="Debug mode.") + parser.add_argument("-v", "--verbose", action="store_true", default=False, help="Verbose.") + args = vars(parser.parse_args()) + + # Start resolver thread + resolve_queue = queue.Queue() + th = threading.Thread(target=resolve, args=()) + th.setDaemon(True) + th.start() + + if args["debug"]: + app.debug = True + app.run(host='0.0.0.0', port=args["port"], threaded=True) +