270 lines
11 KiB
Python
270 lines
11 KiB
Python
import time
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
from tenacity import retry, stop_after_attempt, wait_fixed
|
|
from device.LaminaController import LaminaController
|
|
from device.LaminaController import GeneratePackage_DLSP001_p280039
|
|
from device.LaminaController import GenerateImage_DLSP001_p280039
|
|
from device.tools.ByteConv import trans_list_to_str
|
|
from device.tools.IntelHex import file_Bin_to_IntelHex
|
|
|
|
def test_communication(time_out=2):
|
|
""" 通信成功率测试 """
|
|
time_start = time.time()
|
|
param_saved = dev_lamina.flag_print, dev_lamina.retry, dev_lamina.time_out
|
|
dev_lamina.flag_print = False
|
|
dev_lamina.retry = 1
|
|
try:
|
|
while True:
|
|
dev_lamina.frame_read(0x0C, 0x20)
|
|
print(f"Time Stamp: {time.ctime()}")
|
|
print(f"Success Frame: {dev_lamina.log['read']}")
|
|
print(f"Failed Frame: {dev_lamina.log['send'] - dev_lamina.log['read']}")
|
|
print(f"Max Series Failed Frame: {dev_lamina.log['keep-fail']}")
|
|
time.sleep(time_out)
|
|
finally:
|
|
time_end = time.time()
|
|
print("Test Result: ")
|
|
print(f"Time Start: {time.strftime(r'%Y-%m-%d %H:%M:%S', time.localtime(time_start))}, \tTime End: {time.strftime(r'%Y-%m-%d %H:%M:%S', time.localtime(time_end))}")
|
|
print(f"Time Elapsed: {time_end - time_start}")
|
|
print(f"Success Rate: {dev_lamina.log['read'] / dev_lamina.log['send'] * 100}%")
|
|
dev_lamina.flag_print, dev_lamina.retry, dev_lamina.time_out = param_saved
|
|
|
|
def test_record(path_CFG=None, path_data=None):
|
|
""" 执行录波数据读取流程 """
|
|
if path_CFG is None: path_CFG = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039\record") / f"record_{'-'.join(time.ctime().replace(':', '').split(' '))}.cfg"
|
|
if path_data is None: path_data = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039\record") / f"record_{'-'.join(time.ctime().replace(':', '').split(' '))}.dat"
|
|
|
|
if not dev_lamina.frame_record():
|
|
return
|
|
config = dev_lamina.log['record']['config']
|
|
data = dev_lamina.log['record']['data']
|
|
|
|
# Header File
|
|
|
|
# Config File
|
|
text_cfg = ""
|
|
text_cfg += f"LaminaController,1,{config['Standard']}\r\n"
|
|
text_cfg += f"{config['ChannelNum']},{config['ChNum_Alg']}A,{config['ChNum_Dgt']}D\r\n"
|
|
for i in range(config['ChNum_Alg']):
|
|
if config['ChannelDescription'][i][-1] == 'V':
|
|
text_cfg += f"{config['ChannelDescription'][i]},{1/config['ChannelCoefficient'][i]},0,0,-32767,32767,0.001,1,S\r\n"
|
|
elif config['ChannelDescription'][i][-1] == 'A':
|
|
text_cfg += f"{config['ChannelDescription'][i]},{1/config['ChannelCoefficient'][i]},0,0,-32767,32767,1,1,S\r\n"
|
|
else:
|
|
raise Exception("Unknow Channel Units.")
|
|
for i in range(config['ChNum_Dgt']):
|
|
text_cfg += f"{config['ChannelDescription'][i + config['ChNum_Alg']]}\r\n"
|
|
text_cfg += f"{config['SysFreq']}\r\n"
|
|
text_cfg += f"{config['FreqNum']}\r\n"
|
|
for i in range(config['FreqNum']):
|
|
text_cfg += f"{config['SampleFreq']},{config['SamplePoint']}\r\n"
|
|
# text_cfg += f"{datetime(**config['StartTime']).strftime('%y/%m/%d,%H:%M:%S')}\r\n"
|
|
# text_cfg += f"{datetime(**config['TriggerTime']).strftime('%y/%m/%d,%H:%M:%S')}\r\n"
|
|
text_cfg += f"{datetime.now().strftime('%y/%m/%d,%H:%M:%S')}\r\n"
|
|
text_cfg += f"{datetime.now().strftime('%y/%m/%d,%H:%M:%S')}\r\n"
|
|
text_cfg += f"ASCII\r\n"
|
|
text_cfg += f"1\r\n"
|
|
path_CFG.write_text(text_cfg)
|
|
|
|
# Data File
|
|
text_record = ""
|
|
for point in data:
|
|
# line_record = f"{point['index']},{point['timestamp'] * 1000},"
|
|
line_record = f"{point['index']},{30},"
|
|
for data_alg in point['ChAlg']:
|
|
line_record += f"{data_alg},"
|
|
for data_dgt in point['ChDgt']:
|
|
line_record += f"{data_dgt},"
|
|
text_record += line_record + "\r\n"
|
|
path_data.write_text(text_record)
|
|
|
|
print(f"Saved Path:")
|
|
print(f"\tconfig: {path_CFG}")
|
|
print(f"\tdata: {path_data}")
|
|
|
|
|
|
def make_Image():
|
|
""" 叠光控制器DSP镜像与升级包生成流程 """
|
|
root = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039")
|
|
result = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039\result")
|
|
|
|
# 正常启动镜像
|
|
hex_boot = Path(r"D:\WorkingProject\LightStackOptimizer\software\lamina_controller_dsp\bootloader\Debug\bootloader.hex")
|
|
hex_main = Path(r"D:\WorkingProject\LightStackOptimizer\software\lamina_controller_dsp\lamina_controller_dsp\DEBUG\lamina_controller_dsp.hex")
|
|
hex_back = root / r"DLSP001_240828_0900_B1.01.hex"
|
|
|
|
file_image = result / f'{hex_main.stem}_ROM.hex'
|
|
file_main_header = result / 'header_main.bin'
|
|
file_back_header = result / 'header_back.bin'
|
|
|
|
data_bins = GenerateImage_DLSP001_p280039(hex_boot, hex_main, hex_back)
|
|
|
|
file_main_header.write_bytes(data_bins[1])
|
|
file_back_header.write_bytes(data_bins[2])
|
|
|
|
data_hex = file_Bin_to_IntelHex(data_bins[0], 0x80000, memory_width=2)
|
|
file_image.write_text(data_hex)
|
|
|
|
# 异常镜像-主分区md5错误
|
|
file_image1 = result / f'{file_image.stem}_b1.hex'
|
|
data_image = data_bins[0].copy()
|
|
data_image[2 * 0x006018: 2 * 0x00601A] = [0x00, 0x01, 0x00, 0x02]
|
|
data_hex = file_Bin_to_IntelHex(data_image, 0x80000, memory_width=2)
|
|
file_image1.write_text(data_hex)
|
|
|
|
# 异常镜像-备份分区md5错误
|
|
file_image2 = result / f'{file_image.stem}_b2.hex'
|
|
data_image = data_bins[0].copy()
|
|
data_image[2 * 0x007018: 2 * 0x00701A] = [0x00, 0x01, 0x00, 0x02]
|
|
data_hex = file_Bin_to_IntelHex(data_image, 0x80000, memory_width=2)
|
|
file_image2.write_text(data_hex)
|
|
|
|
# 异常镜像-双分区md5错误
|
|
file_image3 = result / f'{file_image.stem}_b3.hex'
|
|
data_image = data_bins[0].copy()
|
|
data_image[2 * 0x006018: 2 * 0x00601A] = [0x00, 0x01, 0x00, 0x02]
|
|
data_image[2 * 0x007018: 2 * 0x00701A] = [0x00, 0x01, 0x00, 0x02]
|
|
data_hex = file_Bin_to_IntelHex(data_image, 0x80000, memory_width=2)
|
|
file_image3.write_text(data_hex)
|
|
|
|
|
|
def make_Pakeage(fp: Path):
|
|
""" 生成升级包 """
|
|
|
|
hex_update = fp
|
|
file_package = fp.parent / f'{hex_update.stem}.dat'
|
|
file_update_bin = fp.parent / f'{hex_update.stem}.bin'
|
|
file_package_buffer = fp.parent / f'{hex_update.stem}.datbuffer'
|
|
|
|
data_package, data_update_bin = GeneratePackage_DLSP001_p280039(hex_update)
|
|
data_buffer = bytearray(2 * len(data_package))
|
|
|
|
for i in range(len(data_package)):
|
|
data_buffer[2*i] = data_package[i]
|
|
|
|
|
|
file_package.write_bytes(data_package)
|
|
file_update_bin.write_bytes(data_update_bin)
|
|
file_package_buffer.write_bytes(data_buffer)
|
|
|
|
return file_package
|
|
|
|
def test():
|
|
""" 测试用代码 """
|
|
if 0:
|
|
dev_lamina.frame_write_str(0x82, [0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA])
|
|
dev_lamina.frame_write_str(0x82, [0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
dev_lamina.frame_write_str(0x82, [0x0A, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
dev_lamina.frame_write_str(0x82, [0xFF, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
dev_lamina.frame_write_str(0x82, [0xA1, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
dev_lamina.frame_write_str(0x82, [0x1A, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
dev_lamina.frame_write_str(0x82, [0x99, 0x99, 0x99, 0x99, 0x99, 0x99])
|
|
dev_lamina.frame_write_str(0x82, [0x00, 0x00, 0x00, 0x00, 0x00, 0x01])
|
|
if 0:
|
|
dev_lamina.frame_write_one(0x52, 0x01)
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_write_one(0x50, 0x00)
|
|
if 0:
|
|
while 1:
|
|
code_mes = input("扫描数据")
|
|
temp = code_mes[5:7] + code_mes[-10:]
|
|
code_addr = [int(temp[i:i+2], 16) for i in range(0, len(temp), 2)]
|
|
print(f"扫描结果: {code_mes}")
|
|
print(f"载波地址: {trans_list_to_str(code_addr)}")
|
|
dev_lamina.frame_read(0x100, 0x20)
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_write_str(0x0180, list(code_mes))
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_read(0x180, 0x10)
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_write_str(0x82, code_addr)
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_read(0x80, 0x08)
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_write_one(0xA3, 0x01)
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_write_one(0x51, 0x01)
|
|
time.sleep(5)
|
|
dev_lamina.frame_read(0x0E, 0x13)
|
|
time.sleep(5)
|
|
dev_lamina.frame_read(0x0E, 0x13)
|
|
time.sleep(0.5)
|
|
dev_lamina.frame_write_one(0x50, 0x00)
|
|
|
|
if 0:
|
|
dev_lamina.frame_write_one(0x0054, 0x01)
|
|
dev_lamina.frame_read(0x000E, 0x02)
|
|
dev_lamina.frame_write_one(0x0054, 0x03)
|
|
dev_lamina.frame_read(0x000E, 0x02)
|
|
dev_lamina.frame_write_one(0x0054, 0x07)
|
|
dev_lamina.frame_read(0x000E, 0x02)
|
|
dev_lamina.frame_write_one(0x0054, 0x06)
|
|
dev_lamina.frame_read(0x000E, 0x02)
|
|
dev_lamina.frame_write_one(0x0054, 0x04)
|
|
dev_lamina.frame_read(0x000E, 0x02)
|
|
dev_lamina.frame_write_one(0x0054, 0x00)
|
|
dev_lamina.frame_read(0x000E, 0x02)
|
|
if 0:
|
|
dev_lamina.frame_read(0x0E, 0x14)
|
|
if 0:
|
|
dev_lamina.frame_read(0x60, 0x60)
|
|
if 0:
|
|
dev_lamina.frame_read(0x70, 0x02)
|
|
dev_lamina.frame_write_one(0x70, 2100)
|
|
dev_lamina.frame_write_one(0x71, 2200)
|
|
dev_lamina.frame_read(0x70, 0x02)
|
|
dev_lamina.frame_write_one(0x70, 2300)
|
|
dev_lamina.frame_write_one(0x71, 2100)
|
|
dev_lamina.frame_read(0x70, 0x02)
|
|
if 0:
|
|
dev_lamina.frame_write_str(0x0170, list("SN202405201117-1"))
|
|
dev_lamina.frame_write_str(0x0180, list("MES202405201117-2"))
|
|
dev_lamina.frame_write_str(0x0190, list("D202405211500-3"))
|
|
time.sleep(2)
|
|
dev_lamina.frame_read(0x0170, 0x30)
|
|
|
|
|
|
if __name__=='__main__':
|
|
mode_config = {
|
|
"Log": {'com_name': None,
|
|
# 'addr_645': [0x01, 0x00, 0x00, 0x00, 0x00, 0x40],
|
|
},
|
|
"Debug": {'com_name': 'COM8', 'baudrate': 115200, 'parity': 'N', 'bytesize': 8, 'stopbits': 1,
|
|
# 'addr_645': [0x01, 0x02, 0x03, 0x04, 0x05, 0x06],
|
|
'frame_print': True,
|
|
'time_out': 0.5, 'retry': 3},
|
|
}
|
|
|
|
dev_lamina = LaminaController(**mode_config['Debug'])
|
|
|
|
dev_lamina.frame_read(0x0100, 0x20)
|
|
# dev_lamina.frame_read(0x0A, 0x20)
|
|
# dev_lamina.frame_read(0x60, 0x60)
|
|
|
|
|
|
if not hasattr(__builtins__,"__IPYTHON__") and 0: #
|
|
""" 读取故障录波数据 """
|
|
path_CFG = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039\result\record4.cfg")
|
|
path_data = Path(r"D:\WorkSpace\UserTool\SelfTool\FrameParser\test\p280039\result\record4.dat")
|
|
# 手动触发录波
|
|
dev_lamina.frame_write_one(0x56, 1)
|
|
|
|
test_record(path_CFG, path_data)
|
|
|
|
if not hasattr(__builtins__,"__IPYTHON__"): # and 0
|
|
""" 升级流程 """
|
|
path_project = Path("D:\WorkingProject\LightStackOptimizer\software\lamina_controller_dsp\lamina_controller_dsp")
|
|
file_hex = path_project / "DEBUG\lamina_controller_dsp.hex"
|
|
if not file_hex.exists():
|
|
raise Exception("工程编译目标文件不存在.")
|
|
|
|
dev_lamina.frame_write_one(0x60, 0)
|
|
time.sleep(1)
|
|
if dev_lamina.frame_update(file_hex, makefile=True):
|
|
time.sleep(6)
|
|
dev_lamina.frame_read(0x0100, 0x20)
|
|
# dev_lamina.frame_write_one(0x52, 0x01)
|
|
|
|
|