diff --git a/app/__init__.py b/app/__init__.py index c0403b5b49d168a66632020067f0ee3af6a6a526..eb3cdb8b7300c4b4b021d1d213e9182ea36f5d49 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -8,7 +8,7 @@ from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_login import LoginManager from flask_babel import Babel - +from flask_socketio import SocketIO from config import Config app = Flask(__name__) @@ -63,6 +63,10 @@ def get_locale(): """ +# Run flask app with socketIO +socketio = SocketIO() +socketio.init_app(app) + #mariabd mysql portti 3306 tarkista? Bootstrap(app) diff --git a/app/experiment/templates/experiment_statistics.html b/app/experiment/templates/experiment_statistics.html index d381258467ab0833b7bf0736a849152fed023155..4a4c79e67145f368ff50dbe94dde8a5c5d2d2159 100644 --- a/app/experiment/templates/experiment_statistics.html +++ b/app/experiment/templates/experiment_statistics.html @@ -107,6 +107,12 @@ </tbody> </table> + +<div class="progress hidden"> + <div id="image-loading-progress" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="width: 0%"> + <!-- Creating image... --> + </div> +</div> <img class="embody-image-container"> @@ -165,6 +171,7 @@ </tbody> </table> +<script src="{{ url_for('static', filename='lib/js/socket.io.js') }}" ></script> <script src="{{ url_for('static', filename='js/getDrawing.js') }}" ></script> {% endblock %} \ No newline at end of file diff --git a/app/experiment/views.py b/app/experiment/views.py index cb4b3188da9f0e1b43a90ac2048f0d1f9a1d86d3..7fb547d02feb075e526c18683dacd6f27da52797 100644 --- a/app/experiment/views.py +++ b/app/experiment/views.py @@ -851,14 +851,46 @@ def statistics(): import embody_plot from flask_cors import CORS,cross_origin +from flask_socketio import emit +from app import socketio -@experiment_blueprint.route('/create_embody', methods=['POST']) -@cross_origin() -def create_embody(): +''' +Old method +#@experiment_blueprint.route('/create_embody', methods=['POST']) +#@cross_origin() +def create_embody(): #page = request.args.get("page") page = request.form["page"] img_path = embody_plot.get_coordinates(page) #return send_file('static/' + img_path, 'test') return json.dumps({'path':img_path}) +''' +# (https://flask-socketio.readthedocs.io/en/latest/) +# TODO: Using nginx as a WebSocket Reverse Proxy +# TODO: Gunicorn Web Server + +@cross_origin() +@socketio.on('connect', namespace="/create_embody") +def create_embody(): + print("connection succesful") + emit('success', {'connection': 'on'}) + +@cross_origin() +@socketio.on('draw', namespace="/create_embody") +def create_embody(page_id): + page = page_id["page"] + + img_path = embody_plot.get_coordinates(page) + print(img_path) + emit('end', {'path':img_path}) + +''' +@socketio.on('end', namespace="/create_embody") +def create_embody(): + print("connection end") + emit('end', {'connection': 'off'}) +''' + +# EOF diff --git a/app/static/css/main.css b/app/static/css/main.css index 7da83e0cc1f793db2f1bd93afac05330b11d3ad7..c6fc26330722748ff114cc9d29d1052bfa22e7bf 100644 --- a/app/static/css/main.css +++ b/app/static/css/main.css @@ -49,3 +49,12 @@ body { display: none; } +.progress-bar { + height:2em; +} +.progress { + height:2em; + background-color:rgb(248, 249, 250); + -webkit-box-shadow: none; + box-shadow: none; + } diff --git a/app/static/js/getDrawing.js b/app/static/js/getDrawing.js index 8d0ec0d56aa1bf8a6a36daf0fede85f0f087a867..b3159fafb9d0dae032667a48f3d57f527c925e06 100644 --- a/app/static/js/getDrawing.js +++ b/app/static/js/getDrawing.js @@ -1,22 +1,57 @@ const baseURI = 'http://127.0.0.1:8000/'; -var getDrawingURI = baseURI + 'experiment/create_embody'; - +var getDrawingURI = baseURI + 'create_embody'; +//var getDrawingURI = baseURI + 'experiment/create_embody'; $(document).ready(function()Â { var drawButtons = $(".embody-get-drawing"); var imageContainer = $(".embody-image-container") - var source = '' + var progressBarContainer = $(".progress") + var progressBar = $("#image-loading-progress") + + // With sockets + function initConnection(socket) { + socket.on('success', function(msg) { + console.log(msg) + }); + + socket.on('progress', function(data) { + progressBar.width(100*(data.done/data.from) + '%') + }); + + socket.on('end', function(img) { + socket.disconnect() + + // Draw image to statistic -page + var source = img.path + d = new Date() + imageContainer.attr("src", "/static/" + source + "?" +d.getTime()) + + // Remove progress bar + progressBarContainer.addClass("hidden") + progressBar.width('0%') + }); + } + drawButtons.click(function(event) { event.preventDefault() - var spinner = $(event.target.firstElementChild) - spinner.removeClass("hidden") + // Init socket + var socket = io.connect(getDrawingURI); + initConnection(socket) + // var pageId = this.dataset.value + socket.emit('draw', {page:pageId}) + progressBarContainer.removeClass("hidden") + + /* + With AJAX -calls + var spinner = $(event.target.firstElementChild) + spinner.removeClass("hidden") $.ajax({ url: getDrawingURI, @@ -29,6 +64,7 @@ $(document).ready(function()Â { imageContainer.attr("src", "/static/" + source + "?" +d.getTime()) spinner.addClass("hidden") }) + */ }) diff --git a/embody_plot.py b/embody_plot.py index b7927b7297f48fb4f72c1cd4a1f0f1a8a6dc34fe..90e92fddbddb8424f7f9b3029e598be906f80df2 100644 --- a/embody_plot.py +++ b/embody_plot.py @@ -164,8 +164,14 @@ def format_coordinates(cursor): "coordinates":list(map(map_coordinates, x,y,r)) } +from flask_socketio import emit +from app import socketio + def plot_coordinates(coordinates): + # Total amount of points + points_count = len(coordinates['coordinates']) + # Load image to a plot image = mpimg.imread(IMAGE_PATH) image_mask = mpimg.imread(IMAGE_PATH_MASK) @@ -183,12 +189,17 @@ def plot_coordinates(coordinates): ax2.set_title("gaussian disk around points") frame = np.zeros((HEIGHT,WIDTH)) - for point in coordinates["coordinates"]: + for idx, point in enumerate(coordinates["coordinates"]): frame[point[1], point[0]] = 1 point = ndimage.gaussian_filter(frame, sigma=5) ax2.imshow(point, cmap='hot', interpolation='none') - # TODO: send progress information to frontend + # Try to send progress information to socket.io + try: + socketio.sleep(0) + emit('progress', {'done':idx+1/points_count, 'from':points_count}) + except RuntimeError as err: + continue ax2.imshow(image_mask)