import threading
|
import socket
|
import re
|
import time
|
import datetime
|
import os
|
import numpy as np
|
import pandas as pd
|
import faiss
|
import cv2
|
from flask import Flask
|
from flask import request
|
from flask import render_template
|
|
# live stream for channel 0, change to right url first
|
live_stream_0 = "http://192.168.77.60/flv?app=live&stream=math_review_0"
|
|
math_expr_checking_df = pd.DataFrame(columns=["time", "total", "num_of_yes", "num_of_no", "num_of_invalid", "all_expressions", "screenshot"])
|
math_expr_checking_df['time'] = pd.to_datetime(math_expr_checking_df['time'])
|
|
'''
|
receive math expression checking result from socket (sent from VideoPipe)
|
'''
|
def expr_checking_result_receiver():
|
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
bind_ip = '192.168.77.68'
|
bind_port = 3333
|
udp_socket.bind((bind_ip, bind_port))
|
|
while True:
|
data, addr = udp_socket.recvfrom(1024 * 64)
|
s = data.decode()
|
print('############################################')
|
print(f'Received data: \n{s}')
|
print(f'From address: {addr}')
|
|
li = re.findall("\<\-\-.*?\-\-\>", s, re.DOTALL)
|
print(f"total {len(li)} records parsed! going to append to data frame...")
|
for l in li:
|
items = str(l).split('\n')
|
'''
|
items[0] <--
|
items[1] time
|
items[2] channel index, frame index
|
items[3] total num, num of yes, num of no, number of invalid
|
items[4] 1st expression string, 2nd expression string, 3rd expression string, ...
|
items[5] screenshot path
|
items[6] -->
|
'''
|
assert(len(items) == 7)
|
# append items to dataframe
|
math_expr_checking_df.loc[len(math_expr_checking_df)] = [items[1].split('.')[0], items[3].split(',')[0], items[3].split(',')[1], items[3].split(',')[2], items[3].split(',')[3], items[4], items[5]]
|
print(f"now total {len(math_expr_checking_df)} records in math_expr_checking_df!")
|
print('############################################')
|
|
'''
|
create flask app
|
'''
|
app = Flask(__name__)
|
|
# home page
|
@app.route("/", methods=["GET", "POST"])
|
def home():
|
'''
|
filter properties
|
'''
|
select_channel = "all"
|
if 'select_channel' in request.form:
|
select_channel = request.form['select_channel']
|
|
# 1 hour by default
|
now = time.time()
|
past_1_hour = now - 3600
|
select_start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(past_1_hour))
|
select_end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now))
|
|
if 'select_start_time' in request.form and request.form['select_start_time'] != '':
|
select_start_time = datetime.datetime.strptime(request.form['select_start_time'], '%Y-%m-%dT%H:%M:%S')
|
|
if 'select_end_time' in request.form and request.form['select_end_time'] != '':
|
select_end_time = datetime.datetime.strptime(request.form['select_end_time'], '%Y-%m-%dT%H:%M:%S')
|
|
sql = "total != ''"
|
if select_channel != 'all':
|
sql += f" & channel == '{select_channel}'"
|
sql += f" & time >= '{select_start_time}'"
|
sql += f" & time < '{select_end_time}'"
|
|
print(sql)
|
filter_df = math_expr_checking_df.query(sql)
|
print(filter_df)
|
expr_checking_results = []
|
for index, row in filter_df.iterrows():
|
expr_checking_results.append({'uid':index, \
|
'time':row['time'], \
|
'total':row['total'], \
|
'num_of_yes':row['num_of_yes'], \
|
'num_of_no':row['num_of_no'], \
|
'num_of_invalid':row['num_of_invalid'], \
|
'all_expressions':row['all_expressions'], \
|
'screenshot': row['screenshot']})
|
return render_template("home.html", \
|
expr_checking_results=expr_checking_results, \
|
total_records=len(filter_df), \
|
select_start_time = select_start_time, \
|
select_end_time = select_end_time, \
|
live_stream_0=live_stream_0)
|
|
if __name__ == "__main__":
|
# start expr checking results receiving thread
|
receiver = threading.Thread(target = expr_checking_result_receiver)
|
receiver.start()
|
|
# run server
|
app.run(host="192.168.77.68", port=3636)
|