LISHUZUOXUN_yangjiang/PureBackend/exam_driver.py

227 lines
9.0 KiB
Python
Raw Normal View History

2024-09-23 14:54:15 +08:00
# coding: gb2312
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>Һ<EFBFBD>
import threading
import time
import traceback
from copy import deepcopy
from LogRecord.log_recorder import GLOBAL_LOG
from PureBackend.base_driver import MODEL_MEDIAPIPE
from PureBackend.healthy_backend import HealthyBackend
from PureBackend.network_driver import NetworkDriver
from PureBackend.synchronization import Synchronization
from PureBackend.general import *
from AcrossPlatform.get_platform import *
class ExamDriver(NetworkDriver, Synchronization, HealthyBackend):
def __init__(self, master_mode=True, positioning=True, camera=True, model=MODEL_MEDIAPIPE, speaker=True,
multi_positioning_mode=True, device_type=UNKNOWN, pure_mode=False):
super().__init__(master_mode, positioning, camera, model, speaker, multi_positioning_mode, device_type, pure_mode)
# <20><>ǰ<EFBFBD><C7B0>ѵ<EFBFBD><D1B5>Ŀ
self.project = None
self.exercise_tag = ""
self.running = None
self.running_mes = {}
# ʵʱչʾ
# <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>˵ijɼ<C4B3>
self.synchronization_info = {}
self.statistics_score = {SITUP: [], RUNAROUND: [], PUSHUP: [], PULLUP: [], RUNNING: [], 'total': [],
'top': {'total': {}, SITUP: {}, RUNAROUND: {}, PULLUP: {}, PUSHUP: {}, RUNNING: {}}}
self._statistics_score = {}
self._statistics_sql_score = {}
self._sql_score = {}
self.hrbo_info = {}
self._hrbo_info = {}
self.closed_chamber = {}
self.tag_mes = {HR: None, BO: None}
self.send_score_signal = threading.Event()
self.send_score_signal.set()
self.send_sql_score_signal = threading.Event()
threading.Thread(target=self.send_score).start()
threading.Thread(target=self.send_sql_score).start()
# <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵ
def start_exercise(self):
try:
self.reset_hr_bo_record()
self.camera.start_record()
video_name = self.project.info[ID] + '_' + self.project.info[
"name"] + '_' + self.project.exercise_type + '_' + 'unknow'
# <20><>ʼ<EFBFBD><CABC>ϼ<C4BB><C2BC>
if SYS_PLATFORM == WINDOWS:
self.video_recorder.write_start(video_name)
self.project.start()
# self.project.waiting_for_start()
# <20><><EFBFBD>մ<EFBFBD><D5B4>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>˵ijɼ<C4B3>
self.synchronization_info = {}
self.tag_mes = {HR: None, BO: None}
return True
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}",need_print=True)
return None
# ǿ<>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD><D1B5><EFBFBD><EFBFBD>
def stop_exercise(self):
try:
if self.project:
info = self.project.get_info()
else:
info = None
self.camera.stop_record()
self.camera.clear_cache()
self.project.kill()
result = self.project.get_result()
score = result["score"]
if score == '<EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>':
real_score = 0
else:
real_score = float(score)
video_name = self.project.info[ID] + '_' + self.project.info[
"name"] + '_' + self.project.exercise_type + '_' + str(real_score)
if SYS_PLATFORM == WINDOWS:
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<C4BB><C2BC>
self.video_recorder.write_stop(video_name)
self.synchronization_info[self.exercise_tag] = {}
self.send_score_signal.set()
return info
except Exception as e:
GLOBAL_LOG.write(f"ǿ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵ<EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{str(e)}<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>{traceback.format_exc()}")
return None
# <20><>ȡ<EFBFBD><C8A1>ѵ<EFBFBD>ɼ<EFBFBD>
def get_score(self):
try:
score_result = self.project.get_result()
band_id = self.project.info.get("band_id")
tag_mes = self.positioning.get_tag_mes(band_id)
temp = {}
if tag_mes:
self.update_hr_bo_record(tag_mes)
temp['hr'] = tag_mes[HR]
temp['bo'] = "{:.2%}".format(tag_mes[BO] / 100)
if tag_mes[HR] >= 190 or tag_mes[BO] <= 80:
temp['normal'] = False
else:
temp['normal'] = True
self.tag_mes = {HR: temp['hr'], BO: temp['bo']}
else:
if self.tag_mes[HR] and self.tag_mes[BO]:
tag_mes = self.tag_mes
else:
tag_mes = {HR: '-', BO: '-'}
temp['hr'] = tag_mes[HR]
temp['bo'] = tag_mes[BO]
temp['normal'] = True
# # <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
# tag_mes = {'hr': 90, 'bo': 88}
# self.update_hr_bo_record(tag_mes)
# <20><><EFBFBD><EFBFBD>hrbo
score_result.update(self.hr_bo_record)
temp['name'] = self.project.info[NAME]
temp['id'] = self.project.info[ID]
temp['count'] = score_result['count']
self.synchronization_info[self.exercise_tag] = temp
self.send_score_signal.set()
return score_result
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ѵ<EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>󣬴<EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>{e.args}, "f"{traceback.format_exc()}", need_print=True)
return None
# <20><>ȡ<EFBFBD>ܲ<EFBFBD><DCB2>ɼ<EFBFBD>
def running_score(self):
try:
raw_score = self.running.get_score()
final_score = []
# <20>Գ<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if raw_score:
raw_score = sorted(raw_score,
key=lambda x: (-x["score"], -x["round"], x["band_id"], ["total_time"]))
rank = 0
last_total_time = -1
for score in raw_score:
if score["total_time"] != last_total_time:
rank += 1
last_total_time = score["total_time"]
full_mes = deepcopy(score)
band_id = score["band_id"]
tag_mes = self.positioning.get_tag_status(band_id)
person_mes = self.running_mes[band_id]
full_mes.update(person_mes)
full_mes.update({
"rank": rank
})
full_mes.update(tag_mes)
final_score.append(full_mes)
temp = []
for row in final_score:
if row[HR] != 0 and row[BO] != 0:
hr = row[HR]
bo = "{:.2%}".format(row[BO] / 100)
if row[HR] >= 220 or row[BO] < 80:
normal = False
else:
normal = True
else:
hr = '-'
bo = '-'
normal = True
temp.append(
{'id': row['id'], 'name': row['name'], 'hr': hr, 'bo': bo,
'rank': row['rank'], 'finish': row['finish'], 'round': row['round'],
'count': row['total_time'], 'normal': normal})
self.synchronization_info[RUNNING] = temp
self.send_score_signal.set()
return final_score
except Exception as e:
GLOBAL_LOG.write(f"<EFBFBD><EFBFBD>ȡ<EFBFBD>ܲ<EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>󣬴<EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>{e.args}, "f"{traceback.format_exc()}", need_print=True)
return None
# ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7>ͳɼ<CDB3>
def send_score(self):
while True:
try:
self.send_score_signal.wait()
self.send_score_signal.clear()
manager_ip_list = self.connection.get_manager()
ip = self.connection.get_self_ip()
if manager_ip_list:
self.synchronization_info['time'] = time.time()
address_list = []
pkg_list = []
for manage_ip in manager_ip_list:
address_list.append((manage_ip, server_port))
pkg_list.append(
[{'data': {DATA: self.synchronization_info, 'ip': ip}, 'data_type': 'totals_data'}])
self.client.distributed_send(address_list, pkg_list)
except Exception:
continue
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>ɼ<EFBFBD>
def send_sql_score(self):
while True:
try:
self.send_sql_score_signal.wait()
self.send_sql_score_signal.clear()
manager_ip_list = self.connection.get_manager()
ip = self.connection.get_self_ip()
_ip = ip.split('.')[2]
if manager_ip_list:
address_list = []
pkg_list = []
for manage_ip in manager_ip_list:
address_list.append((manage_ip, server_port))
pkg_list.append(
[{'data': {DATA: self._statistics_sql_score, 'ip': ip},
'data_type': 'totals_sql_data'}])
self.client.distributed_send(address_list, pkg_list)
self._statistics_sql_score = {}
except Exception as e:
# print(traceback.format_exc())
continue