227 lines
9.0 KiB
Python
227 lines
9.0 KiB
Python
|
# 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
|