-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmyWidget.py
158 lines (130 loc) · 5.65 KB
/
myWidget.py
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import os
import time
import pandas as pd
from PyQt5.QtCore import pyqtSignal,QCoreApplication,Qt
from PyQt5.QtWidgets import QApplication,QMainWindow
from PyQt5.QtGui import QIcon,QFont
from ui_Widget import Ui_MainWindow
from utils.com_utils import *
import utils.global_var as g
from Plot import Line_plot
from uart.protocol import app_data_processor,app_data_handler
class WidgetLogic(QMainWindow):
def __init__(self,parent=None): # 单继承ui界面
super().__init__()
self.ui = Ui_MainWindow() # self.ui就可以获得ui的属性
self.ui.setupUi(self) # 初始化UI界面
# self.setWindowOpacity(0.9) # 窗口透明度
# 获取显示器分辨率
self.ui.desktop = QApplication.desktop()
self.ui.screenRect = self.ui.desktop.screenGeometry()
self.ui.screenheight = self.ui.screenRect.height()
self.ui.screenwidth = self.ui.screenRect.width()
self.resize(int(self.ui.screenwidth * 0.7), int(self.ui.screenheight * 0.7)) #启动尺寸自适应
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #高分辨率屏幕缩放适应
self.cur_mode = 0 # 状态未连接
self.widgets_init()
self.pic = Line_plot(self.ui.socket_graph)
self.pic_uart = Line_plot(self.ui.serial_graph)
self.vars_init()
# 应用层协议
def uart_recv_data(self,cur_data:bytes):
cur_data_list = app_data_processor(cur_data) # 处理数据
app_data_handler(self,cur_data_list) # 完成数据展示
# 公共变量初始化
def vars_init(self):
self.recv_data_on = True
self.cur_socket_mode = self.ui.socket_mode.currentText()
self.cur_ip_choose = self.ui.ip_com.currentText()
self.cur_port = self.ui.port_input.text()
self.uart_paint_recv = False
# 所有控件的初始化函数
def widgets_init(self):
self._com_box_init()
self._btn_init()
self._text_edit_init()
def _text_edit_init(self):
self.ui.port_input.setText("8080")
self.ui.socket_switch.setEnabled(True)
def _btn_init(self):
# 默认开关不开
self.ui.socket_switch.setEnabled(False)
# 待完成
self.ui.save_socket_data.clicked.connect(self.save_socket_recv_data)
self.ui.save_uart_data_btn.clicked.connect(self.save_uart_recv_data)
self.ui.clear_socket_data.clicked.connect(self._clear_socket_data)
self.ui.clear_uart_data.clicked.connect(self._clear_uart_data)
def _com_box_init(self):
# 区分是socket还是uart的初始化!
if(self.ui.tabWidget.currentWidget == "socket_tab"):
ip_list = get_iplist()
# 初始化下拉框内容
self.ui.ip_com.addItems(ip_list)
self.ui.ip_com.setCurrentText(ip_list[0])
self.ui.socket_mode.addItems(mode_list)
else:
com_list = get_coms()
self.ui.uart_com.addItems(com_list)
baud_list = get_bauds()
self.ui.baud_boxcom.addItems(baud_list)
self.ui.baud_boxcom.setCurrentText("115200")
g.set_var("baudrate","115200")
def _clear_socket_data(self):
self.pic.data_dict = {key:[] for key in self.pic.pic_dict}
# 绘图区数据清空
for idx,key in enumerate(self.pic.data_dict):
self.pic.pic_dict[key].clear()
self.pic.p2_1.setData([])
self.ui.socket_recv_show.clear()
self.pic.cur_x = 0
print("清除数据")
def _clear_uart_data(self):
self.pic_uart.data_dict = {key:[] for key in self.pic_uart.pic_dict}
# 绘图区数据清空
for idx,key in enumerate(self.pic_uart.data_dict):
self.pic_uart.pic_dict[key].clear()
self.pic_uart.p2_1.setData([])
self.ui.uart_recv_show.clear()
self.pic_uart.cur_x = 0
print("清除数据")
# 接收数据开关槽函数
def recv_content_handle(self):
if(self.ui.recv_data_btn.isChecked() == True):
self.recv_data_on = True
else:
self.recv_data_on = False
print("停止接收数据")
# 负责将接收到的数据存储在对象属性中
def socket_recv_data(self,cur_data):
if self.recv_data_on:
cur_data = cur_data.split(" ")
if(self.pic.cur_x<10000):
# 将每一列数据提取到字典中
for idx,key in enumerate(self.pic.pic_dict):
self.pic.data_dict[key].append(float(cur_data[idx]))
self.pic.cur_x += 1
# 数据轮转
else:
pass
# 给绘图类更新数据
self.pic.new_data = True
# 像文本框中写入内容
self.ui.socket_recv_show.append(str(cur_data))
# 保存socket接收的数据
def save_socket_recv_data(self):
data = pd.DataFrame(self.pic.data_dict)
time_prefix = time.strftime("%Y-%m-%d-%H-%M-%S")
with open("./data_save/"+time_prefix+"_socket"+".csv",mode="w",newline="") as f:
data.to_csv(f)
self.ui.socket_recv_show.append("数据保存成功")
print("保存数据成功")
# path
def save_uart_recv_data(self):
data = pd.DataFrame(self.pic_uart.data_dict)
time_prefix = time.strftime("%Y-%m-%d-%H-%M-%S")
if not os.path.isdir("./data_save"):
os.mkdir("./data_save")
with open("./data_save/"+time_prefix+"_uart"+".csv",mode="w",newline="") as f:
data.to_csv(f)
self.ui.socket_recv_show.append("数据保存成功")
print("保存数据成功")