import json
import os
import threading
#import ansicon
import PySimpleGUI as sg
from threading import Thread
import functools
import telnetlib
import time
import re
ENABLE_PRINT = 1
RESPONSE = ""
PREV_CMD = ""
END_STR = "ROUTER_MPU /home\x1b[m # "
STOP_FLAG = "NNN"
def bios_send(s):
result = []
while len(s) > 0:
if len(s) <= 10:
result.append(s)
break
else:
sub_str = s[:10]
result.append(sub_str)
s = s[10:]
for r in result:
send(r)
time.sleep(0.150)
send(b"\r\n")
def timeout(seconds_before_timeout):
def deco(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
res = [Exception('function [%s] timeout [%s seconds] exceeded!' % (func.__name__, seconds_before_timeout))]
def newFunc():
try:
res[0] = func(*args, **kwargs)
except Exception as e:
res[0] = e
t = Thread(target=newFunc)
t.daemon = True
try:
t.start()
t.join(seconds_before_timeout)
except Exception as e:
print('error starting thread')
raise e
ret = res[0]
if isinstance(ret, BaseException):
raise ret
return ret
return wrapper
return deco
@timeout(5)
def connect(HOST,PORT):
tn = telnetlib.Telnet(HOST, PORT)
return tn
def send(content):
global PREV_CMD
if isinstance(content,bytes):
tn.write(content)
else:
if not content.endswith("\n"):
content+="\n"
tn.write(content.encode('utf-8'))
PREV_CMD = content
def receive(timeout = 5):
global RESPONSE
global tn
RESPONSE = tn.read_until(b'\n',timeout=timeout).decode('utf-8')
return RESPONSE
def send_when_receive(condition_cmd):
global RESPONSE
temp_response = RESPONSE
for receive_content, send_content in condition_cmd:
if not receive_content:
send(send_content)
else:
if receive_content in temp_response:
print("检测到打印:{}, 下发命令:{}".format(receive_content,temp_response))
send(send_content)
time.sleep(1)
def receive_timeout(timeout = 5):
global tn
response = tn.read_until(b'No end string, read until timeout\n',timeout=timeout).decode('utf-8')
return response
def receive_all(timeout = 5,end_str = END_STR):
global RESPONSE
global tn
RESPONSE = ""
prevtemp = ""
for i in range(timeout*5):
temp = receive_timeout(0.5)
if temp:
print(temp, end="")
RESPONSE += temp
if prevtemp.endswith(end_str) and temp == "":
break
prevtemp = temp
return RESPONSE
def record_time():
global LOG
global RESPONSE
global tn
#send("reset")
send("reboot")
LOG = []
LOG.append((time.time(),"START"))
while True:
RESPONSE = tn.read_until(b'\n')
try:
RESPONSE = RESPONSE.decode('utf-8')
if ENABLE_PRINT:
print(RESPONSE)
#print(RESPONSE)
LOG.append((time.time(),RESPONSE))
if STOP_FLAG in RESPONSE:
break
except:
if ENABLE_PRINT:
print(RESPONSE)
def calculate_time():
global SIMPLE_LOG
prev_t =LOG[0][0]
for (t,line) in LOG:
if ("SLT_PrintStart@TestCase@" in line and "@START" in line):
SIMPLE_LOG.append((t-prev_t,line.split("@")[2]+"_"+line.split("@")[3]+"_init"))
prev_t = t
elif ("SLT_PrintStart@TestCase@" in line and "@PASS" in line) or ("SLT_PrintStart@TestCase@" in line and "@FAIL" in line):
SIMPLE_LOG.append((t-prev_t,line.split("@")[2]+"_"+line.split("@")[3]))
prev_t = t
elif(".....H.SM. .A .st.a.te.:" in line):
SIMPLE_LOG.append((t-prev_t,"BIOS_init"))
prev_t = t
elif("Now.........................................Start rbos" in line or "Rbos already run ! Now Go to Rtos" in line):
SIMPLE_LOG.append((t,"BIOS_test_cost"))
prev_t = t
elif("RBOS_TAISHAN_TEST_INDEX_ADDR" in line):
SIMPLE_LOG.append(t-prev_t,"RBOS_test")
prev_t = t
elif("SLT_PrintStart@KeyInfor@SELF_DEF@SLT_Version@" in line):
SIMPLE_LOG.append((t-prev_t,"sdk.out_boot"))
prev_t = t
elif("Uncompressing Linux... done, booting the 5.x kernel." in line):
SIMPLE_LOG.append((t-prev_t,"Linux_boot"))
prev_t = t
SIMPLE_LOG.append((t-prev_t,"Error Code"))
SIMPLE_LOG.append((LOG[-1][0]-LOG[0][0],"Total Time"))
def getPrint():
while running:
RESPONSE = tn.read_until(b'\n').decode('utf-8')
print(RESPONSE)
def getSdkOut():
send("n")
send("q")
send("y")
FTP_IP = values["FTP_IP"]
BOARD_LOCAL_IP= values["board_local_ip"]
send("export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home")
send("ifconfig eth0 " + BOARD_LOCAL_IP + "up")
time.sleep(0.01)
time.sleep(0.02)
send("cd /home")
send("rm sdk.out")
time.sleep(0.02)
send("ftpget -u 1260 -p 1260 " + FTP_IP + " /home/sdk.out sdk.out")
receive_all(10)
connected = False
if "can't connect to remote host" in RESPONSE:
temp = 0
for i in range(5):
send("rmmod hi1260_mii_mac.ko")
send("/home/startup.sh 192.168.0.53")
send("ifconfig eth0 " + BOARD_LOCAL_IP)
receive_all(2)
send("ping " + FTP_IP)
receive_all(5)
if "ms" in RESPONSE:
connected = True
send(b"\x03")
break
temp = i
if connected:
send("ftpget -u 1260 -p 1260 " + FTP_IP + " /home/sdk.out sdk.out")
receive_all(10)
send("chmod +x *")
send("./gdb sdk.out")
send("b slt_test_user_init")
send("r")
# tn.read_al
receive_all(1, end_str="@SLT_PrintEnd\r\r\n")
send(b"\x03")
def print_every_100s():
global stop_loop
global interval
global loop_msg
stop_loop = 0
while True:
print("定时发送,间隔{}秒".format(interval))
send(loop_msg)
# 等待100s
time.sleep(interval)
if stop_loop != 0:
# 变量发生改变,跳出循环
stop_loop = 0
break
def is_positive_integer(s):
pattern = r'^[1-9]\d*$'
if re.match(pattern, s):
return True
else:
return False
# 保存用户输入到文件
def save_config():
with open(DATA_FILE, 'w') as file:
json.dump({
"IP": values["IP"],
"port": values["port"],
"FTP_IP": values["FTP_IP"],
"芯片名称": values["芯片名称"],
'发送信息': values["发送信息"],
'interval': values["interval"],
"start_addr" : values["start_addr"],
"end_addr": values["end_addr"],
"文件FTP路径": "",
}, file)
DATA_FILE = 'pyremote3默认配置.json'
default_data = {
"IP": "71.19.0.120",
"port": "",
"FTP_IP": "71.19.0.120",
"芯片名称": "Hi1260SV100",
'发送信息': "",
"board_local_ip": "71.19.0.53",
'interval': "",
"start_addr" : "",
"end_addr": "",
"文件FTP路径": "",
}
if os.path.exists(DATA_FILE):
try:
with open(DATA_FILE, 'r') as file:
data = json.load(file)
# 更新默认数据为用户文件中的数据,但只保留我们关心的键
default_data.update({k: data[k] for k in default_data if k in data})
print(default_data)
except json.JSONDecodeError:
print("?")
# 如果文件损坏或格式不正确,则使用默认数据重新创建文件
with open(DATA_FILE, 'w') as file:
json.dump(default_data, file)
else:
# 如果文件不存在,则创建文件并写入默认数据
with open(DATA_FILE, 'w') as file:
json.dump(default_data, file)
#ansicon.load()
output = sg.Output(size=(60, 20))
layout = [
[sg.Text('IP:'),sg.Input(key="IP", default_text=default_data["IP"], enable_events=True),sg.Text('Port:'),sg.Input(key="port", default_text="1001", enable_events=True)],
[sg.Button('连接')],
#[sg.Text('网关'),sg.Input(key="网关", default_text="192.168.0.100", enable_events=True)],
#[sg.Text("条件1:")],
#[sg.Text('检测到:'),sg.Input(key="receive1", default_text="hello", enable_events=True),sg.Text('下发命令:'),sg.Input(key="send1", default_text="world", enable_events=True)],
[sg.Text("发送信息"),sg.Input(key='发送信息', size=(50, 50), default_text=default_data["发送信息"])],
[sg.Button('ROUTER_MPU下发送'),sg.Button('Shell下发送'),sg.Text('每隔'),sg.Input(key='interval', default_text=default_data["interval"],size=(5,1)),sg.Text("秒"),sg.Button('定时发送'),sg.Button("停止定时发送")],
[sg.Button('接收1s')],
[sg.Text('芯片名称'),sg.Input(key="芯片名称", default_text=default_data["芯片名称"], enable_events=True),sg.Text('文件FTP路径'),sg.Input(key="文件FTP路径", default_text=default_data["文件FTP路径"], enable_events=True)],
[sg.Text('FTP_IP:'),sg.Input(key="FTP_IP", default_text=default_data["FTP_IP"], enable_events=True),sg.Text('单板IP:'),sg.Input(key="board_local_ip", default_text=default_data["board_local_ip"], enable_events=True)],
[sg.Text("SLT测试用"),sg.Button('重新获取sdk.out'),sg.Button("一键升级MT1"),sg.Button("一键升级MT2")],
[sg.Button("使用说明")],
[sg.Text('起始地址'),sg.Input(key='start_addr', default_text=default_data["start_addr"],size=(12,1)),sg.Text('结束地址'),sg.Input(key='end_addr', default_text=default_data["end_addr"],size=(12,1)),sg.Button('dump寄存器')],
[output],
]
window = sg.Window('远程单板连接', layout)
start = False
initial = False
running = False
stop_loop = 0
interval = 10000
loop_msg = ""
isConnected = False
while True:
event, values = window.read()
if initial == False:
initial = True
#f = open("settings.txt", 'rw')
#settings = json.load(f)
#window["IP"].update(value = settings["IP"])
#window["port"].update(value=settings["port"])
#if running:
# #RESPONSE = tn.read_until(b'\n').decode('utf-8')
# t = threading.Thread(target=getPrint)
# t.start()
#send_when_receive(values["receive1"], values["send1"])
if event == sg.WINDOW_CLOSED:
break
if event == "连接":
ip = values["IP"]
port = values["port"]
#settings = {'IP': values['IP'],
# 'port': values['port']}
#f = open("settings.txt", 'w')
#json.dump(settings, f)
#f.close()
#print("cd /home\r\n\x1b[32mROUTER_MPU /home\x1b[m # export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home\r\n")
try:
tn = connect(ip, port)
except Exception as e:
print("链接失败,请检查IP地址和port。详细错误信息如下:")
print(e)
else:
print("连接成功!")
isConnected = True
running = True
t0 = threading.Thread(target=getPrint)
t0.start()
elif event == "定时发送":
save_config()
# 创建一个线程,用于每隔100s打印一次
if is_positive_integer(values['interval']):
loop_msg = values["发送信息"]
interval = int(values['interval'])
loop_thread = threading.Thread(target=print_every_100s)
loop_thread.start()
else:
sg.popup("请在每隔' '秒处输入正整数")
elif event == "停止定时发送":
stop_loop = 1
elif event == "ROUTER_MPU下发送":
save_config()
if isConnected:
if values["发送信息"]:
send(values["发送信息"])
else:
sg.popup("请先连接单板")
continue
elif event == "Shell下发送":
save_config()
if isConnected:
if values["发送信息"]:
bios_send(values["发送信息"])
else:
sg.popup("请先连接单板")
continue
elif event == "重新获取sdk.out":
save_config()
if not isConnected:
sg.popup("请先连接单板")
continue
running = False
time.sleep(0.01)
t = threading.Thread(target=getSdkOut)
t.start()
running = True
time.sleep(1)
t0 = threading.Thread(target=getPrint)
elif event == "接收1s":
save_config()
if not isConnected:
sg.popup("请先连接单板")
continue
response = receive_timeout(1)
print(response)
running = True
#elif event == "停止自动下发":
# running = False
elif event == "使用说明":
sg.popup("使用IPOP共享串口后,在第一行输入IP地址和Port(其中Port是IPOP共享的端口,IP地址就是本机的IP,可在terminal里输入ipconfig查看),然后点连接。连接成功后填写FTP_IP、单板IP和芯片名称后,即可一键升级。\n" + "当前的芯片名称、文件FTP路径和、FTP_IP和单板IP会生成如下的命令:\n"+
"ifconfig eth0 " + values["board_local_ip"]+"\n"+
"ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MTx_FLASHx_PARTx.bin 1260 1260\n")+"......")
elif event == "一键升级MT1":
save_config()
if not isConnected:
sg.popup("请先连接单板")
continue
running = False
flag = True
result = 0
bios_send("ifconfig eth0 " + values["board_local_ip"])
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT1_FLASH0_PART0.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x0000000 0xa000000 0x2000000")
receive_all(3)
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT1_FLASH0_PART1.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x2000000 0xa000000 0x2000000")
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT1_FLASH1_PART0.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x4000000 0xa000000 0x2000000")
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT1_FLASH1_PART1.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x6000000 0xa000000 0x2000000")
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if result == 4:
sg.popup("升级成功")
else:
sg.popup("升级失败,请检查网口配置后重试")
running = True
t0.start()
elif event == "一键升级MT2":
save_config()
if not isConnected:
sg.popup("请先连接单板")
continue
flag = True
result = 0
running = False
bios_send("ifconfig eth0 " + values["board_local_ip"])
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT2_FLASH0_PART0.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x0000000 0xa000000 0x2000000")
receive_all(3)
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT2_FLASH0_PART1.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x2000000 0xa000000 0x2000000")
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " + os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT2_FLASH1_PART0.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x4000000 0xa000000 0x2000000")
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if flag:
bios_send("ftp -get 0xa000000 eth0 " + values["FTP_IP"] + " " +os.path.join(values["文件FTP路径"], values["芯片名称"]+"_SLT_MT2_FLASH1_PART1.bin 1260 1260"))
while flag:
prev_response = receive_all(5)
if "File Download Successfully" in prev_response + RESPONSE:
bios_send("flash -w 0 0x6000000 0xa000000 0x2000000")
while "ret=0" not in RESPONSE:
receive_all(5)
result += 1
break
elif "failed" in RESPONSE:
flag = False
break
if result == 4:
sg.popup("升级成功")
else:
sg.popup("升级失败,请检查网口配置后重试")
running = True
t0.start()
elif event == "dump寄存器":
save_config()
if not isConnected:
sg.popup("请先连接单板")
continue
start_addr = values["start_addr"]
end_addr = values["end_addr"]
count = 0
try:
for i in range(eval(start_addr), eval(end_addr) + 1):
count +=1
if i % 4 == 0:
send('devmem 0x{:04x}'.format(i))
if count % 400 == 0:
print("等待1s")
time.sleep(1)
if count>4000:
print("寄存器过多 暂时停止dump")
break
except:
sg.popup("无法识别地址,请用十六进制或十进制数填写开始和结束地址")
window.close()
请将上述代码的前端GUI改为PyQt
最新发布