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())