添加U盘升级功能

This commit is contained in:
ranchuan
2023-09-22 18:26:14 +08:00
parent 4292478f67
commit d8e41f133b
9 changed files with 304 additions and 14 deletions

View File

@@ -33,6 +33,10 @@ WARN_TXT="警告:\n程序升级会删除主板中以前的程序为保证
QUESTION_TXT="程序升级会删除主板中以前的程序,非专业人员不要操作。\n\
为保证升级成功,请耐心等待升级完成,不要退出升级界面,期间不要给主板断电、重启。\n\
点击[YES]以进行升级。"
QUESTION_SSH_TXT="升级文件中包含系统服务。\n\
升级系统服务会导致远程登陆失效,即本程序将无法与设备建立通信。\n\
请等待升级完成之后重新启动设备,以保证系统服务正常运行。\n\
点击[YES]以进行升级。"
def warn_creat(father:QDialog,text:str,rect:QRect):
lable=QLabel(father)
@@ -111,6 +115,8 @@ class updata_dlg(QObject):
self.widget.setWindowFlags(Qt.WindowType.WindowStaysOnTopHint)
self.addrs=""
self.dhcp_server=None
# 如果要升级服务则在升级之后ssh会连接不上
self.systemd_stop=False
self.but_y=60
self.but_y_step=40
self.file_list_init()
@@ -118,7 +124,8 @@ class updata_dlg(QObject):
self.save_but_init()
self.dhcp_but_init()
self.console_but_init()
self.console_but_init()
self.settime_but_init()
# self.restart_but_init()
self.cmd_but_init()
self.refresh_but_init()
self.sstate_but_init()
@@ -218,6 +225,24 @@ class updata_dlg(QObject):
self.console_but.clicked.connect(self.console_but_clicked)
self.console_but.setToolTip("通过设备的串口控制台升级程序这种方式需要使用到U盘。")
# 初始化同步时间按钮
def settime_but_init(self):
self.settime_but = QPushButton(self.widget)
self.settime_but.setObjectName(u"settime_but")
self.settime_but.setGeometry(QRect(700, 140, 93, 28))
self.settime_but.setText("同步时间")
self.settime_but.clicked.connect(self.settime_but_clicked)
self.settime_but.setToolTip("同步主板时间。")
# 初始化重新启动按钮
def restart_but_init(self):
self.restart_but = QPushButton(self.widget)
self.restart_but.setObjectName(u"restart_but")
self.restart_but.setGeometry(QRect(700, 180, 93, 28))
self.restart_but.setText("重启软件")
self.restart_but.clicked.connect(self.restart_but_clicked)
self.restart_but.setToolTip("如果已知设备ip地址但刷新不出可尝试重启设备软件。")
# 初始化发送命令按钮
def cmd_but_init(self):
self.cmd_but = QPushButton(self.widget)
@@ -396,6 +421,7 @@ class updata_dlg(QObject):
# 根据文件列表生成目标列表
def build_dst_list(self,file_list):
self.systemd_stop=False
dst_list=[]
for i in file_list:
if(i[-4:]==".elf"):
@@ -411,6 +437,11 @@ class updata_dlg(QObject):
dst_list.append("/home/root/config/"+"judge.lua")
elif(i[-4:]==".axf"):
dst_list.append("/lib/firmware/"+"checker_m4.axf")
elif(i[-3:]==".py"):
dst_list.append("/home/root/"+"daemon.py")
elif(i[-8:]==".service"):
dst_list.append("/lib/systemd/system/pydeamon.service")
self.systemd_stop=True
else:
dst_list.append("/home/root/config/"+i)
return dst_list
@@ -474,6 +505,9 @@ class updata_dlg(QObject):
return
if(self.show_question("警告",QUESTION_TXT)==False):
return
if(self.systemd_stop==True):
if(self.show_question("警告",QUESTION_SSH_TXT)==False):
return
print("slaves:",slave_list)
w=QDialog(self.widget)
warn_creat(w,WARN_TXT,QRect(0,0,700-100,90))
@@ -519,7 +553,7 @@ class updata_dlg(QObject):
print("slaves:",slave_list)
w=QDialog(self.widget)
w.resize(700-100, len(slave_list)*40+20)
w.setWindowTitle("升级mcu")
w.setWindowTitle("升级方案")
self.scheme_mcu(slave_list)
self.creat_progress(w,0,slave_list)
w.show()
@@ -537,10 +571,29 @@ class updata_dlg(QObject):
self.data_list=[]
self.comm_test(slave_list)
# 时间同步按下
def settime_but_clicked(self):
print("settime_but clicked.")
slave_list=self.get_selected_slave()
if(len(slave_list)==0):
return
self.data_list=[]
self.settime_host(slave_list)
# 重新启动按下
def restart_but_clicked(self):
print("restart_but clicked.")
slave_list=self.get_selected_slave()
if(len(slave_list)==0):
return
self.data_list=[]
self.restart_host(slave_list)
def addfile_but_clicked(self):
print("addfile_but clicked")
fileName,fileType = QFileDialog.getOpenFileNames(None, "选取文件", os.getcwd(),
"主板程序(*.elf);;主板m4程序(*.axf);;小板程序(*.bin);;检测方案(*.json);;判定脚本(*.lua);;任意文件(*)")
"""主板程序(*.elf);;主板m4程序(*.axf);;小板程序(*.bin);;检测方案(*.json);;启动脚本(*.sh);;
判定脚本(*.lua);;守护进程脚本(*.py);;守护进程服务(*.service);;设备树文件(*.dtb);;任意文件(*)""")
print(fileName,fileType)
path=self.getpath()+"file\\"
for i in fileName:
@@ -593,7 +646,7 @@ class updata_dlg(QObject):
# 扫描文件
def scan_file(self):
self.file_list.clear()
self.file_list.addItems(self.find_type([".sh",".elf",".bin",".lua",".json",".dtb",".axf"]))
self.file_list.addItems(self.find_type([".sh",".elf",".bin",".lua",".json",".dtb",".axf",".py",".service"]))
# 扫描从机
def scan_slave(self):
@@ -679,6 +732,30 @@ class updata_dlg(QObject):
t = threading.Thread(target=u.bordcast, args=(cmd_list,))
t.start()
# 同步时间
def settime_host(self,ip_list):
u=udp.myudp(1,255)
u.dst_ip_list=ip_list
# u.rate_signal.connect(self.rate_slot)
# u.end_signal.connect(self.end_slot)
updata_cmd="local settime "+mysql.get_time()+' '
cmd_list=[]
cmd_list.append((updata_cmd,1,9))
t = threading.Thread(target=u.bordcast, args=(cmd_list,))
t.start()
# 重新启动
def restart_host(self,ip_list):
u=udp.myudp(1,255)
u.dst_ip_list=ip_list
# u.rate_signal.connect(self.rate_slot)
# u.end_signal.connect(self.end_slot)
updata_cmd="systemctl restart atk-qtapp-start.service "
cmd_list=[]
cmd_list.append((updata_cmd,1,9))
t = threading.Thread(target=u.bordcast, args=(cmd_list,))
t.start()
# 小板通信测试
def comm_test(self,ip_list):
u=udp.myudp(1,255)
@@ -749,11 +826,18 @@ class updata_dlg(QObject):
f.rate_signal.connect(self.rate_slot)
if(restart==True):
print(ip,"|stop app.")
f.send_cmd("systemctl stop atk-qtapp-start.service")
f.send_cmd("systemctl stop atk-qtapp-start.service",sleep_s=2)
f.send_cmd("systemctl stop pydeamon.service",sleep_s=2)
if(self.systemd_stop==True):
f.send_cmd("systemctl disable pydeamon.service",sleep_s=2)
f.put_file(ip,dst_list,src_list)
if(restart==True):
print(ip,"|start app.")
f.send_cmd("systemctl restart atk-qtapp-start.service")
# 控制enable disable会导致ssh无法连接
if(self.systemd_stop==True):
f.send_cmd("systemctl enable pydeamon.service",sleep_s=2)
f.send_cmd("systemctl start pydeamon.service",sleep_s=2)
f.send_cmd("sync",sleep_s=3)
f.close()
self.end_signal.emit(ip,True,"完成")