diff --git a/frontend/templates/dashboard.html b/frontend/templates/dashboard.html index 56d190c..7480808 100644 --- a/frontend/templates/dashboard.html +++ b/frontend/templates/dashboard.html @@ -1,14 +1,9 @@ {% extends "cosmic_base.html" %} {% block title %}Dashboard{% endblock %} {% block head_additions %} - - - {% endblock %} {% block content %}
+
{% endblock %}
\ No newline at end of file
diff --git a/frontend/web_ui.py b/frontend/web_ui.py
index 4c968cd..757a08d 100644
--- a/frontend/web_ui.py
+++ b/frontend/web_ui.py
@@ -1,56 +1,109 @@
-from flask import Flask, flash, redirect, render_template, request
+from flask import Flask, flash, redirect, render_template, request, make_response
import matplotlib.pyplot as plt
import io
import base64
import c3pyo as c3
+import sqlite3
+import numpy as np
+import matplotlib.dates as mdates
app = Flask(__name__)
+sqlite_location = "../storage/sqlite_db"
+def initDB():
+ conn = sqlite3.connect(sqlite_location)
+ cursor = conn.cursor()
+ cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='Events'")
+ if cursor.fetchone() == None:
+ cursor.execute('''CREATE TABLE Events
+ (UTCUnixTime INTEGER, SubSeconds REAL, TempreatureC REAL, Humidity REAL, AccelX REAL,
+ AccelY REAL, AccelZ REAL, MagX REAL, MagY REAL, MagZ REAL, Pressure REAL, Longitude REAL,
+ Latitude REAL, DetectorName TEXT, DetectorVersion TEXT);''')
+ conn.commit()
@app.route("/base/")
def base():
return render_template(
'cosmic_base.html', **locals())
-def get_line_chart_json():
- # data
- x = [1, 2, 3, 4, 5, 6, 7]
- y1 = [150, 450, 200, 100, 300, 0, 325]
- y2 = [230, 220, 150, 400, 105, 50, 302]
-
- # chart
- chart = c3.LineChart()
- chart.plot(x, y1, label='Series 1')
- chart.plot(x, y2, label='Series 2')
- chart.bind_to('line_chart_div')
- return chart.json()
-
-@app.route('/test/', methods=['GET', 'POST'])
-def test():
- chart_json = get_line_chart_json()
- return render_template('c3pyo.html', chart_json=chart_json)
@app.route('/', methods=['GET', 'POST'])
@app.route('/dashboard/', methods=['GET', 'POST'])
def dashboard():
- chart_json = get_line_chart_json()
- return render_template('dashboard.html', chart_json=chart_json)
+ return render_template('dashboard.html', chart_json=0)
-@app.route('/plot/')
+
+@app.route('/histogram.png')
def build_plot():
+ # get user set parameters
+ start_time = request.args.get('start_time', type=int)
+ end_time = request.args.get('end_time', type=int)
+ bin_size_seconds = request.args.get('bin_size_seconds', type=int)
+ plot_title = ''
+ # get some data
+ data = []
+ conn = sqlite3.connect(sqlite_location)
+ cursor = conn.cursor()
+ # only get the last n seconds if the start time was negative
+ if start_time < 0:
+ plot_title += "Histogram of events over the last " + str(-start_time/60) + " minutes\nbin size: "+str(bin_size_seconds)+" [s]"
+ cursor.execute("SELECT * FROM Events ORDER BY UTCUnixTime DESC, SubSeconds DESC;")
+ start_time = cursor.fetchone()[0] + start_time
+ end_time = 9000000000
+ else:
+ plot_title += "Histogram of events over a set time\nbin size: " + str(bin_size_seconds) + " [s]"
+ cursor.execute("SELECT * FROM Events WHERE UTCUnixTime BETWEEN ? AND ? ORDER BY UTCUnixTime DESC, SubSeconds DESC;",
+ (start_time, end_time))
+ data = cursor.fetchall()
+
+ # massage data
+ if len(data) == 0:
+ plt.hist([])
+ plt.title("No data to display")
+ else:
+ event_time_list = [data[i][0] + data[i][1] for i in range(len(data))]
+ #event_time_list = [data[i][0] for i in range(len(data))]
+ bin_edges = range(int(event_time_list[len(event_time_list) - 1]), int(event_time_list[0]), bin_size_seconds)
+ x_axis_limits = (int(event_time_list[len(event_time_list) - 1]), int(event_time_list[0])+1)
+ # convert our unix timestamps to Matplotlib format
+ event_time_list = mdates.epoch2num(event_time_list)
+ bin_edges = mdates.epoch2num(bin_edges)
+ x_axis_limits = mdates.epoch2num(x_axis_limits)
+
+ # make the plot
+ plt.hist(event_time_list,bins=bin_edges)
+ plt.title(plot_title)
+ plt.xlabel("Time [UTC]")
+ plt.ylabel("Number of Events [1]")
+
+ plt.subplots_adjust(bottom=0.2)
+ plt.xticks(rotation=25)
+ plt.tick_params(which='both', width=2, direction="out", top=False, right=False)
+ plt.tick_params(which='major', length=5)
+ plt.tick_params(which='minor', length=3, color='r')
+
+ # do the date formatting
+ ax = plt.gca()
+ locator = mdates.AutoDateLocator(minticks=7)
+ locator.intervald[mdates.SECONDLY] = [1,10,30]
+ formatter = mdates.AutoDateFormatter(locator)
+ formatter.scaled[1 / (24. * 60.)] = '%H:%M:%S'
+ ax.xaxis.set_major_locator(locator)
+ ax.xaxis.set_major_formatter(formatter)
+ ax.set_xlim(x_axis_limits)
+
+ # return the generated plot
img = io.BytesIO()
-
- y = [1,2,3,4,5]
- x = [0,2,1,3,4]
- plt.plot(x,y)
plt.savefig(img, format='png')
img.seek(0)
+ plt.close()
+ response = make_response(img.getvalue())
+ response.headers['Content-Type'] = 'image/png'
+ return response
- plot_url = base64.b64encode(img.getvalue()).decode()
-
- return '