612 lines
24 KiB
Python
Raw Normal View History

2025-04-09 09:49:42 +08:00
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())