wangrong
2025-01-23 02819b5c047bb354b0ef2374e7c6a6ac4bbd5bba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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)