DESKTOP-2QGM7IR\Lab01 5de3c3cc90 第一次提交
2025-04-09 09:49:42 +08:00

612 lines
24 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from PyQt5.QtWidgets import QApplication,QMessageBox,QMainWindow
from PyQt5.QtCore import QTimer
import serial.tools.list_ports
import serial
import time
import configparser
from main_ui2 import *
from DN101_NFC import *
from DN101_ZIGBEE import *
from text_msg import *
NFC_PORT_STR = 'Silicon Labs Dual CP210x USB to UART Bridge: Enhanced COM Port'
ZIG_PORT_STR = 'Silicon Labs Dual CP210x USB to UART Bridge: Standard COM Port'
"""
mainWindow.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)
mainWindow.setFixedSize(mainWindow.width(), mainWindow.height())
"""
class DN101_Tester(QMainWindow):
def __init__(self):
super().__init__()
self.dn101_form = Ui_mainWindow()
self.dn101_form.setupUi(self)
self.init_setup()
self.sig_setup()
self.timer_zig = QTimer(self)
self.timer_zig.timeout.connect(self.zig_update)
self.timer_single = QTimer(self)
self.timer_nfc = QTimer(self)
self.retry_time = 0 #检测重试次数
self.timer_count = 0 #连续检测次数
self.timer_detect = QTimer(self)
self.timer_detect.timeout.connect(self.auto_detect)
#传感器要写的配置
self.senser_info = NFC_INFO()
self.senser_conf = NFC_CONF()
def init_setup(self):
self.dn101_form.pB_read_nfc.setEnabled(False)
self.dn101_form.pB_exec.setEnabled(False)
self.dn101_form.pB_exec_auto.setEnabled(False)
conf_flag = ['停用', '启用', '调试']
zig_power = ['0', '1', '2', '3']
acc_range = ['±8G', '±16G', '±32G', '±64G']
acc_rate = ['±3.2KHz', '±6.4KHz', '±12.8KHz', '±25.6KHz']
self.dn101_form.cB_conf_flag.addItems(conf_flag)
self.dn101_form.cB_zig_power.addItems(zig_power)
self.dn101_form.cB_acc_range.addItems(acc_range)
self.dn101_form.cB_acc_rate.addItems(acc_rate)
self.init_state_ui()
#读取传感器默认配置
if self.read_conf_file():
self.update_ui_senser_info()
#设置生产日期
mf_time = time.strftime("%Y%m%d", time.localtime(time.time()))
self.dn101_form.lE_first_poweron.setText(mf_time)
self.burning_flag = False
self.auto_detect_flag = False
self.write_nfc_flag = False
self.power_on_flag = False
self.device_check_flag = False
self.reset_all_flag = False
self.board_ready_now = True
self.exec_flag = True
def sig_setup(self):
self.dn101_form.pB_open.clicked.connect(self.open_device)
self.dn101_form.pB_read_nfc.clicked.connect(self.read_nfc)
self.dn101_form.pB_exec.clicked.connect(self.exec_manual)
self.dn101_form.pB_exec_auto.clicked.connect(self.exec_auto)
self.dn101_form.cB_burnning.stateChanged.connect(self.setup_exec_flag)
self.dn101_form.cB_write_nfc.stateChanged.connect(self.setup_exec_flag)
self.dn101_form.cB_power_on.stateChanged.connect(self.setup_exec_flag)
self.dn101_form.cB_device_check.stateChanged.connect(self.setup_exec_flag)
self.dn101_form.cB_reset_all.stateChanged.connect(self.setup_exec_flag)
def setup_exec_flag(self):
if self.dn101_form.cB_burnning.isChecked():
self.burning_flag = True
else:
self.burning_flag = False
if self.dn101_form.cB_write_nfc.isChecked():
self.write_nfc_flag = True
else:
self.write_nfc_flag = False
if self.dn101_form.cB_power_on.isChecked():
self.power_on_flag = True
else:
self.power_on_flag = False
if self.dn101_form.cB_device_check.isChecked():
self.device_check_flag = True
else:
self.device_check_flag = False
if self.dn101_form.cB_reset_all.isChecked():
self.reset_all_flag = True
else:
self.reset_all_flag = False
def exec_auto(self):
self.exec_flag = True
self.timer_detect.setInterval(125)
self.timer_detect.start()
def exec_manual(self):
self.timer_detect.stop()
self.execute()
def execute(self):
if self.power_on_flag:
self.power_on()
time.sleep(0.1)
else:
self.power_off()
if self.burning_flag:
self.burning()
if self.write_nfc_flag:
self.write_nfc()
if self.device_check_flag:
self.device_check()
self.exec_flag = False
def device_check(self):
"""
1. Reset
2. Zigbee接收传感器状态信息
3. 若超时从NFC读取传感器状态信息
:return:
"""
self.reset()
self.retry_time = 5
self.zig_conf_recv_flag = False
self.timer_single.singleShot(1000, self.senser_st_check)
self.init_state_ui()
def auto_detect(self):
if self.board_ready_now == True: #有电路板
if self.is_ready() == False:
self.timer_count = self.timer_count + 1
else:
self.timer_count = 0
if self.timer_count >= 4:
self.board_ready_now = False
self.exec_flag = True
else:
if self.is_ready():
self.timer_count = self.timer_count +1
else:
self.timer_count = 0
if self.timer_count >= 4:
self.board_ready_now = True
if self.board_ready_now == True: #有电路板
if self.exec_flag:
self.execute()
elif self.power_on_flag == False:
if self.exec_flag:
self.execute()
def init_state_ui(self):
self.dn101_form.lB_running_state.clear()
self.dn101_form.lB_temp_upper_state.clear()
self.dn101_form.lB_temp_lower_state.clear()
self.dn101_form.lB_nfc_state.clear()
self.dn101_form.lB_acc_state.clear()
self.dn101_form.lB_zigbee_state.clear()
self.dn101_form.lB_vol_state.clear()
self.dn101_form.lB_current_state.clear()
def senser_st_check(self):
"""
检查是否收到Zigbee设备信息
:return:
"""
self.retry_time = self.retry_time - 1
if self.zig_conf_recv_flag:
self.dn101_form.lB_nfc_state.setText(ok_msg)
if self.zig_reader.senser_info1.uAccSta:
self.dn101_form.lB_acc_state.setText(ok_msg)
else:
self.dn101_form.lB_acc_state.setText(fail_msg)
if self.zig_reader.senser_info1.uZigbeeSta:
self.dn101_form.lB_zigbee_state.setText(ok_msg)
else:
self.dn101_form.lB_zigbee_state.setText(fail_msg)
if self.zig_reader.senser_info1.uLowerTempSta:
self.dn101_form.lB_temp_lower_state.setText(ok_msg)
else:
self.dn101_form.lB_temp_lower_state.setText(fail_msg)
if self.zig_reader.senser_info1.uUpperTempSta:
self.dn101_form.lB_temp_upper_state.setText(ok_msg)
else:
self.dn101_form.lB_temp_upper_state.setText(fail_msg)
if self.zig_reader.senser_info1.uRunningFlag:
self.dn101_form.lB_running_state.setText(ok_msg)
else:
self.dn101_form.lB_running_state.setText(fail_msg)
QApplication.processEvents()
if self.power_on_flag == False:
self.timer_single.singleShot(5000, self.device_check)
elif self.retry_time == 0: #Zigbee接收超时
r_nfc = self.read_nfc()
if r_nfc&self.nfc_reader.dev_info.uInitFlag:
self.dn101_form.lB_nfc_state.setText(ok_msg)
if self.nfc_reader.dev_info.uAccSta:
self.dn101_form.lB_acc_state.setText(ok_msg)
else:
self.dn101_form.lB_acc_state.setText(fail_msg)
if self.nfc_reader.dev_info.uZigbeeSta:
self.dn101_form.lB_zigbee_state.setText(ok_msg)
else:
self.dn101_form.lB_zigbee_state.setText(fail_msg)
if self.nfc_reader.dev_info.uLowerTempSta:
self.dn101_form.lB_temp_lower_state.setText(ok_msg)
else:
self.dn101_form.lB_temp_lower_state.setText(fail_msg)
if self.nfc_reader.dev_info.uUpperTempSta:
self.dn101_form.lB_temp_upper_state.setText(ok_msg)
else:
self.dn101_form.lB_temp_upper_state.setText(fail_msg)
if self.nfc_reader.dev_info.uRunningFlag:
self.dn101_form.lB_running_state.setText(ok_msg)
else:
self.dn101_form.lB_running_state.setText(fail_msg)
else:
self.dn101_form.lB_nfc_state.setText(fail_msg)
if self.power_on_flag == False:
self.timer_single.singleShot(1000, self.senser_st_check)
else:
self.timer_single.singleShot(1000, self.senser_st_check)
def write_nfc(self):
"""
将产品信息和配置文件写入ST25DV芯片中
:return:
"""
prev_uuid = self.nfc_reader.nfc_uuid
self.nfc_reader.get_uuid()
time.sleep(0.5)
#存在之前存在,并且与当前值不同
if prev_uuid:
if prev_uuid != self.nfc_reader.nfc_uuid:
if self.dn101_form.cB_auto_increase.isChecked():
sn = int(self.dn101_form.lE_mf_sn.text()) + 1
self.dn101_form.lE_mf_sn.setText(str(sn))
#完全重置
if self.dn101_form.cB_reset_all.isChecked():
local_addr = '{:04d}'.format(int(self.dn101_form.lE_mf_sn.text()))[-4:]
self.dn101_form.lE_zig_local_addr.setText(local_addr)
self.dn101_form.lE_senser_name.setText(self.conf["DEFAULT"]["测点名称"]+local_addr)
self.ui_conf_to_senser()
if self.nfc_reader.nfc_uuid:
self.dn101_form.tE_read_log.setText("DN101 NFC UUID" + hex(self.nfc_reader.nfc_uuid)[2:])
ret1 = self.nfc_reader.write_info(self.senser_info)
ret2 = self.nfc_reader.write_conf(self.senser_conf)
if ret1&ret2:
self.dn101_form.tE_read_log.append("NFC 写入信息成功")
else:
self.dn101_form.tE_read_log.append("NFC 写入信息失败")
else:
self.dn101_form.tE_read_log.setHtml(nfc_read_error)
#完全重置后重启,更新初始化标志
if self.dn101_form.cB_reset_all.isChecked():
self.power_off()
time.sleep(0.5)
self.power_on()
time.sleep(1)
def read_nfc(self):
self.dn101_form.tE_read_log.clear()
self.dn101_form.tE_conf_info.clear()
QApplication.processEvents()
self.nfc_reader.get_uuid()
if self.nfc_reader.nfc_uuid:
self.dn101_form.tE_read_log.setText("DN101 NFC UUID"+ hex(self.nfc_reader.nfc_uuid)[2:])
time.sleep(0.5)
info = self.nfc_reader.read_info()
conf = self.nfc_reader.read_conf()
if info&conf:
self.nfc_reader.dev_info_analysis()
self.nfc_reader.dev_conf_analysis()
self.nfc_update()
self.dn101_form.tE_read_log.append("DN101 NFC读取成功")
return info
else:
self.dn101_form.tE_read_log.append(nfc_read_error)
return False
else:
self.dn101_form.tE_conf_info.clear()
self.dn101_form.tE_read_log.setHtml(nfc_read_error)
return False
def open_device(self):
try:
self.nfc_reader.close()
except Exception as e:
print(e)
pass
try:
self.zig_reader.close()
except Exception as e:
print(e)
pass
try:
nfc_port, zig_port = self.get_nfc_zig_port()
print(nfc_port, zig_port)
self.nfc_ser = serial.Serial(nfc_port, 19200, rtscts=False, dsrdtr=False)
self.zig_ser = serial.Serial(zig_port, 115200, rtscts=False, dsrdtr=False)
self.dn101_form.pB_read_nfc.setEnabled(True)
self.dn101_form.pB_exec.setEnabled(True)
self.dn101_form.pB_exec_auto.setEnabled(True)
self.nfc_reader = Nfc_Reader(self.nfc_ser)
self.zig_reader = Zig_Reader(self.zig_ser)
self.timer_zig.start(100) #启动串口接收分析数据
self.nfc_reader.rfidm_c2_init()
self.dn101_form.tE_read_log.setText("烧录测试工具打开成功\n")
except Exception as e:
print(e)
self.dn101_form.tE_read_log.setText("烧录测试工具打开失败\n")
def nfc_update(self):
msg = ''
for k, i in self.nfc_reader.dev_info_msg.items():
msg = msg + k + ":" + str(i) + "\n"
for k, i in self.nfc_reader.dev_conf_msg.items():
msg = msg + k + ":" + str(i) + "\n"
self.dn101_form.tE_conf_info.setText(msg)
def zig_update(self):
msg = ""
zig_info = self.zig_reader.read()
#将解析的设备信息和特征值输出到界面上
if zig_info==SENSER_INF_PACK2:
for k, i in self.zig_reader.dev_info_msg.items():
msg = msg + k + ":" + str(i) + "\n"
for k, i in self.zig_reader.dev_conf_msg.items():
msg = msg + k + ":" + str(i) + "\n"
self.zig_conf_recv_flag = True
elif (zig_info == EVEL_DATA_PACK1)|(zig_info == EVEL_DATA_PACK2):
for k, i in self.zig_reader.dev_evel_msg.items():
# print(k, " :", i)
if isinstance(i, float):
msg = msg + k + ":" + format(i, ".4f") + "\n"
else:
msg = msg + k + ":" + str(i) + "\n"
if zig_info:
self.dn101_form.tE_zig_info.setText(msg)
print(msg)
def read_conf_file(self):
try:
self.conf = configparser.ConfigParser()
self.conf.read("conf.ini", "UTF-8")
self.dn101_form.tE_read_log.setText("配置文件读取成功")
return True
except Exception as e:
print(e)
self.dn101_form.tE_read_log.setText(conf_file_error)
return False
def update_ui_senser_info(self):
"""
将conf.ini 文件中的配置读取到界面上
:return:
"""
self.dn101_form.lE_hw_version.setText(self.conf["DEFAULT"]["硬件版本"])
self.dn101_form.lE_product_vesion.setText(self.conf["DEFAULT"]["产品型号"])
self.dn101_form.cB_conf_flag.setCurrentText(self.conf["DEFAULT"]["启停机"])
self.dn101_form.lE_wakeup_per.setText(self.conf["DEFAULT"]["唤醒周期"])
self.dn101_form.lE_wave_per.setText(self.conf["DEFAULT"]["波形发送周期"])
self.dn101_form.lE_zig_pid.setText(self.conf["DEFAULT"]["Zigbee PANID"])
self.dn101_form.lE_zig_channel.setText(self.conf["DEFAULT"]["Zigbee 信道"])
self.dn101_form.lE_zig_local_addr.setText(self.conf["DEFAULT"]["Zigbee 本地地址"])
self.dn101_form.lE_zig_dest_addr.setText(self.conf["DEFAULT"]["Zigbee 目标地址"])
self.dn101_form.cB_zig_power.setCurrentIndex(int(self.conf["DEFAULT"]["Zigbee 发射功率"]))
self.dn101_form.lE_zig_retry_num.setText(self.conf["DEFAULT"]["Zigbee 重试次数"])
self.dn101_form.lE_zig_retry_per.setText(self.conf["DEFAULT"]["Zigbee 重试间隔"])
self.dn101_form.cB_acc_range.setCurrentIndex(int(self.conf["DEFAULT"]["ACC 量程"]))
self.dn101_form.cB_acc_rate.setCurrentIndex(int(self.conf["DEFAULT"]["ACC 采样率"]))
self.dn101_form.lE_acc_time.setText(self.conf["DEFAULT"]["ACC 采样时间"])
self.dn101_form.lE_senser_name.setText(self.conf["DEFAULT"]["测点名称"])
self.dn101_form.lE_power_freq1_start.setText(self.conf["DEFAULT"]["频带能量1起始频率"])
self.dn101_form.lE_power_freq1_stop.setText(self.conf["DEFAULT"]["频带能量1截至频率"])
self.dn101_form.lE_power_freq2_start.setText(self.conf["DEFAULT"]["频带能量2起始频率"])
self.dn101_form.lE_power_freq2_stop.setText(self.conf["DEFAULT"]["频带能量2截至频率"])
self.dn101_form.lE_power_freq3_start.setText(self.conf["DEFAULT"]["频带能量3起始频率"])
self.dn101_form.lE_power_freq3_stop.setText(self.conf["DEFAULT"]["频带能量3截至频率"])
self.dn101_form.lE_power_freq4_start.setText(self.conf["DEFAULT"]["频带能量4起始频率"])
self.dn101_form.lE_power_freq4_stop.setText(self.conf["DEFAULT"]["频带能量4截至频率"])
self.dn101_form.lE_power_freq5_start.setText(self.conf["DEFAULT"]["频带能量5起始频率"])
self.dn101_form.lE_power_freq5_stop.setText(self.conf["DEFAULT"]["频带能量5截至频率"])
self.dn101_form.lE_evel_freq_start.setText(self.conf["DEFAULT"]["冲击起始频率"])
self.dn101_form.lE_evel_freq_stop.setText(self.conf["DEFAULT"]["冲击截至频率"])
self.dn101_form.lE_error_freq1.setText(self.conf["DEFAULT"]["故障频率1"])
self.dn101_form.lE_error_freq2.setText(self.conf["DEFAULT"]["故障频率2"])
self.dn101_form.lE_error_freq3.setText(self.conf["DEFAULT"]["故障频率3"])
self.dn101_form.lE_error_freq4.setText(self.conf["DEFAULT"]["故障频率4"])
self.dn101_form.lE_speed_freq_start.setText(self.conf["DEFAULT"]["速度积分起始频率"])
def ui_conf_to_senser(self):
"""
将界面的配置文件打包到 senser_info senser_conf struct中
:return:
"""
try:
if self.reset_all_flag:
self.senser_info.uInitFlag = 0
self.senser_info.hwVersion = int(float(self.dn101_form.lE_hw_version.text())* 10)
self.senser_info.pn = int(self.dn101_form.lE_mf_pn.text())
self.senser_info.sn = int(self.dn101_form.lE_mf_sn.text())
self.senser_info.sTime = int(self.dn101_form.lE_first_poweron.text())
self.senser_info.productType = int(self.dn101_form.lE_product_vesion.text())
#清零
self.senser_info.wakeupTimes = 0
self.senser_info.tzTimes = 0
self.senser_info.wvTimes = 0
else:
ret = self.read_nfc()
time.sleep(0.5)
if ret:
self.senser_info.uInitFlag = self.nfc_reader.dev_info.uInitFlag
self.senser_info.hwVersion = self.nfc_reader.dev_info.hwVersion
self.senser_info.pn = self.nfc_reader.dev_info.pn
self.senser_info.sn = self.nfc_reader.dev_info.pn
self.senser_info.sTime = self.nfc_reader.dev_info.sTime
self.senser_info.wakeupTimes = self.nfc_reader.dev_info.wakeupTimes
self.senser_info.tzTimes = self.nfc_reader.dev_info.tzTimes
self.senser_info.wvTimes = self.nfc_reader.dev_info.wvTimes
self.senser_info.productType = self.nfc_reader.dev_info.productType
else:
self.dn101_form.tE_read_log.setText(nfc_read_error)
self.dn101_form.tE_read_log.append(conf_write_error)
return False
conf_flag = [0, 0xAA, 0xBB]
self.senser_conf.active_flag = conf_flag[self.dn101_form.cB_conf_flag.currentIndex()]
self.senser_conf.wakeup_period = int(self.dn101_form.lE_wakeup_per.text())
self.senser_conf.wave_period = int(self.dn101_form.lE_wave_per.text())
self.senser_conf.zig_panid = int(self.dn101_form.lE_zig_pid.text(), 16)
self.senser_conf.zig_channel = int(self.dn101_form.lE_zig_channel.text())
self.senser_conf.zig_local_addr = int(self.dn101_form.lE_zig_local_addr.text(), 16)
self.senser_conf.zig_dst_addr = int(self.dn101_form.lE_zig_dest_addr.text(), 16)
self.senser_conf.zig_power_level = int(self.dn101_form.cB_zig_power.currentIndex())
self.senser_conf.zig_retry_num = int(self.dn101_form.lE_zig_retry_num.text())
self.senser_conf.zig_retry_time = int(self.dn101_form.lE_zig_retry_per.text())
self.senser_conf.acc_acq_range = int(self.dn101_form.cB_acc_range.currentIndex())
self.senser_conf.acc_acq_freq = int(self.dn101_form.cB_acc_rate.currentIndex())
self.senser_conf.acc_acq_time = int(self.dn101_form.lE_acc_time.text())
self.senser_conf.freq_power1_start = int(self.dn101_form.lE_power_freq1_start.text())
self.senser_conf.freq_power1_stop = int(self.dn101_form.lE_power_freq1_stop.text())
self.senser_conf.freq_power2_start = int(self.dn101_form.lE_power_freq2_start.text())
self.senser_conf.freq_power2_stop = int(self.dn101_form.lE_power_freq2_stop.text())
self.senser_conf.freq_power3_start = int(self.dn101_form.lE_power_freq3_start.text())
self.senser_conf.freq_power3_stop = int(self.dn101_form.lE_power_freq3_stop.text())
self.senser_conf.freq_power4_start = int(self.dn101_form.lE_power_freq4_start.text())
self.senser_conf.freq_power4_stop = int(self.dn101_form.lE_power_freq4_stop.text())
self.senser_conf.freq_power5_start = int(self.dn101_form.lE_power_freq5_start.text())
self.senser_conf.freq_power5_stop = int(self.dn101_form.lE_power_freq5_stop.text())
self.senser_conf.envel_freq_start = int(self.dn101_form.lE_evel_freq_start.text())
self.senser_conf.envel_freq_stop = int(self.dn101_form.lE_evel_freq_stop.text())
self.senser_conf.fail_freq1 = int(self.dn101_form.lE_error_freq1.text())
self.senser_conf.fail_freq2 = int(self.dn101_form.lE_error_freq2.text())
self.senser_conf.fail_freq3 = int(self.dn101_form.lE_error_freq3.text())
self.senser_conf.fail_freq4 = int(self.dn101_form.lE_error_freq4.text())
conf_time = int(time.time())
self.senser_conf.conf_date = conf_time
self.senser_conf.speed_freq_start = int(self.dn101_form.lE_speed_freq_start.text())
node_name = self.dn101_form.lE_senser_name.text().encode("GB18030")
memset(addressof(self.senser_conf.node_name), 0x00, sizeof(self.senser_conf.node_name))
memmove(addressof(self.senser_conf.node_name), node_name, len(node_name))
return True
except Exception as e:
print(e)
self.dn101_form.tE_read_log.setText(conf_msg_error)
return False
def get_nfc_zig_port(self):
serial_ports = self.get_serial_list()
for port in serial_ports:
port = list(port)
#print(port)
if NFC_PORT_STR in port[1]:
nfc_port = port[0]
elif ZIG_PORT_STR in port[1]:
zig_port = port[0]
return (nfc_port, zig_port)
def get_serial_list(self):
serial_ports = serial.tools.list_ports.comports()
serial_list = []
for port in serial_ports:
serial_list.append(list(port))
return serial_list
#功能接口
def power_on(self):
self.nfc_ser.setRTS(False)
def power_off(self):
self.nfc_ser.setRTS(True)
def reset(self):
self.nfc_ser.setDTR(False)
time.sleep(0.1)
self.nfc_ser.setDTR(True)
def is_power_on(self):
if self.nfc_ser.rts:
return True
else:
return False
def burning(self):
self.reset()
self.zig_ser.setRTS(False)
time.sleep(0.1)
self.zig_ser.setRTS(True)
time.sleep(5)
def is_ready(self):
if self.nfc_ser.cts:
return True
else:
return False
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = DN101_Tester()
w.show()
sys.exit(app.exec())