123 lines
4.2 KiB
Python
123 lines
4.2 KiB
Python
import os
|
|
import os.path
|
|
import time
|
|
import threading
|
|
import sqlite3
|
|
from PySide6.QtCore import Signal, QThread
|
|
|
|
|
|
def traversal_files(dir_path):
|
|
if not os.path.exists(dir_path):
|
|
logger("ERROR", "clibs", f"数据文件夹{dir_path}不存在,请确认后重试......", color="red")
|
|
else:
|
|
dirs, files = [], []
|
|
for item in os.scandir(dir_path):
|
|
if item.is_dir():
|
|
dirs.append(item.path.replace("\\", "/"))
|
|
elif item.is_file():
|
|
files.append(item.path.replace("\\", "/"))
|
|
|
|
return dirs, files
|
|
|
|
|
|
def init_logdb():
|
|
global conn, cursor
|
|
conn = sqlite3.connect(":memory:", isolation_level=None, check_same_thread=False, cached_statements=2048)
|
|
cursor = conn.cursor()
|
|
cursor.execute("PRAGMA journal_mode=wal")
|
|
cursor.execute("PRAGMA wal_checkpoint=TRUNCATE")
|
|
cursor.execute("PRAGMA synchronous=normal")
|
|
cursor.execute("PRAGMA temp_store=memory")
|
|
cursor.execute("PRAGMA mmap_size=30000000000")
|
|
cursor.execute("PRAGMA cache_size=200000")
|
|
cursor.execute(
|
|
"""
|
|
create table if not exists logs(
|
|
id integer primary key autoincrement,
|
|
timestamp DATETIME DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime')),
|
|
level text,
|
|
module text,
|
|
content text
|
|
)
|
|
"""
|
|
)
|
|
|
|
|
|
def db_lock(func):
|
|
def wrapper(*args, **kwargs):
|
|
try:
|
|
lock.acquire(True)
|
|
ret = func(*args, **kwargs)
|
|
finally:
|
|
lock.release()
|
|
return ret
|
|
|
|
return wrapper
|
|
|
|
|
|
class LoggerHandler(QThread):
|
|
signal = Signal(str, str)
|
|
|
|
def __init__(self, /):
|
|
super().__init__()
|
|
|
|
@db_lock
|
|
def logger(self, level, module, content, color="black", flag="both"):
|
|
global cursor, stop_flag
|
|
if "move.monitor" in content:
|
|
return
|
|
|
|
if level.upper() == "DEBUG":
|
|
flag = "cursor"
|
|
|
|
if flag == "signal":
|
|
self.signal.emit(content, color)
|
|
elif flag == "cursor":
|
|
cursor.execute(f"INSERT INTO logs (level, module, content) VALUES (?, ?, ?)", (level, module, content))
|
|
elif flag == "both":
|
|
self.signal.emit(content, color)
|
|
cursor.execute(f"INSERT INTO logs (level, module, content) VALUES (?, ?, ?)", (level, module, content))
|
|
|
|
if level.upper() == "ERROR":
|
|
stop_flag = False
|
|
raise Exception()
|
|
|
|
|
|
def detect_db_size():
|
|
@db_lock
|
|
def release_memory():
|
|
line_number = 20000
|
|
leftover = 4000 # 200s
|
|
cursor.execute("SELECT COUNT(id) FROM logs")
|
|
len_records = cursor.fetchone()[0]
|
|
if len_records > line_number:
|
|
del_num = len_records - leftover + 1
|
|
cursor.execute(f"DELETE FROM logs WHERE id < {del_num}")
|
|
cursor.execute(f"UPDATE logs SET id=(id-{del_num - 1}) WHERE id > {del_num - 1}")
|
|
cursor.execute(f"UPDATE sqlite_sequence SET seq = {leftover + 1} WHERE name = 'logs' ")
|
|
cursor.execute("VACUUM")
|
|
|
|
while True:
|
|
release_memory()
|
|
time.sleep(INTERVAL*10)
|
|
|
|
|
|
PREFIX = "resources/assets" # for pyinstaller
|
|
# PREFIX = "assets" # for local testing
|
|
lock = threading.Lock()
|
|
running = [0, 0, 0, 0, 0, 0, 0] # 制动数据/转矩数据/激光数据/精度数据/制动自动化/转矩自动化/耐久数据采集
|
|
stop_flag = False
|
|
functions = ["制动数据处理", "转矩数据处理", "激光数据处理", "精度数据处理", "制动自动化测试", "转矩自动化测试", "耐久数据采集"]
|
|
levels = ["DEBUG", "INFO", "WARNING", "ERROR"]
|
|
ip_addr, ssh_port, socket_port, xService_port, external_port, modbus_port, upgrade_port = "", 22, 5050, 6666, 8080, 502, 4567
|
|
username, password = "luoshi", "luoshi2019"
|
|
INTERVAL, RADIAN, MAX_FRAME_SIZE, MAX_LOG_NUMBER, CYCLE = 1, 57.3, 1024, 10, 30
|
|
c_md, c_hr, c_ec, c_pd, conn, cursor, search_records, logger, count = None, None, None, None, None, None, None, None, 0
|
|
status = {"mysql": 0, "hmi": 0, "md": 0, "ec": 0}
|
|
c_joint_vel, c_servo_trq, c_sensor_trq, c_estimate_trans_trq, c_safety_estop = 1, 2, 3, 4, 3 # 各个指标所在列
|
|
|
|
init_logdb()
|
|
t = threading.Thread(target=detect_db_size)
|
|
t.daemon = True
|
|
t.start()
|