Files
python_tools/updata/runtask_table.py
2024-03-12 17:04:07 +08:00

339 lines
7.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import prottcp as pt
#参数数据类型
_g_params_type =[
"str",
"int8",
"int16",
"int32",
"hex",
"none"
]
# task_id,errcode,par_count,ret_count
_g_ew_task_table=[
("电源准备",0,1,10,0,{
"参数类型":"int16",
"返回值类型":"none",
"参数描述":"检测前校准检测过程中需要使用的电压便于检测过程中快速输出电压范围55~270(0.1V)",
"返回值描述":"无返回值"
}),
("延时等待",1,1,2,1,{
"参数类型":"int16",
"返回值类型":"int16",
"参数描述":"延时时间(0.1s),置1打开电流监控",
"返回值描述":"打开电流监控时的电流波动ADC值"
}),
("测量桥丝阻值",2,4,1,1,{
"参数类型":"int16",
"返回值类型":"int16",
"参数描述":"测量方式:0 4线制;1 2线1-4通;2 2线2-3通;5 读取电阻校准值",
"返回值描述":"打开电流监控时的电流波动ADC值"
}),
("上电充能",3,2,3,2,{
}),
("设置总线电压",4,1,1,1),
("获取总线电流",5,1,0,2),
("使能MTP",6,5,1,0),
("扫描UID",7,5,3,8),
("写配置参数",8,5,7,0),
("检测配置",9,5,7,0),
("验证配置",10,5,4,0),
("模拟注码",11,5,0,0),
("验证模拟注码",12,5,0,0),
("芯片自检",13,5,2,1),
("状态检测",14,5,2,2),
("充电",15,5,2,0),
("放电",16,5,0,0),
("写延时",17,5,1,0),
("读延时",18,5,0,1),
("时钟校准",19,5,2,1),
("设置通信地址",20,5,3,1),
("状态巡检",21,5,3,1),
("起爆使能",22,5,0,0),
("起爆检测",23,5,3,1),
("缓存数据写入MTP",24,5,3,0),
("验证缓存数据",25,5,3,0),
("关总线",26,1,0,0),
("升级",27,5,4,1),
("充能统计",28,2,6,4),
("计算异常",29,0,10,0),
("重新执行任务",30,0,1,0),
("写入三码数据",31,5,0,0),
("验证三码数据",32,5,0,0),
("配置三码数据到小板",33,1,10,0),
("任务插槽",34,0,1,0),
("读MTP",35,5,2,8),
("写MTP",36,5,10,0),
("设置电阻校准值",37,1,1,0),
("读取流水号",38,5,2,2),
("写入流水号",39,5,2,0),
("写固定延时",40,5,1,0),
]
# task_id,errcode,par_count,ret_count
_g_jq_task_table=[
("电源准备",0,1,10,0),
("上电充能",1,2,3,2),
("设置总线电压",2,1,1,1),
("获取总线电流",3,1,0,2),
("扫描UID",4,5,2,8),
("密码验证",5,5,1,0),
("读取芯片代码",6,5,0,1),
("OTP检测",7,5,3,0),
("工厂测试检测",8,5,0,0),
("读取状态",9,5,1,0),
("写工厂信息",10,5,2,0),
("充能统计",11,5,5,4),
("充电电压检测",12,5,2,1),
("延时等待",13,1,2,1),
("写延时",14,5,1,0),
("读延时",15,5,0,1),
("时钟校准",16,5,2,1),
("放电",17,5,2,0),
("复位",18,5,0,0),
("起爆使能",19,5,0,0),
("起爆充能",20,5,3,3),
("使能通讯末电流采集",21,1,0,0),
("获取通讯末电流",22,1,0,1),
("写OTP",23,5,6,0),# opt_addr,len,[data]
("读OTP",24,5,2,10),# 这个任务根据参数1得到实际读取长度
("清除起爆计数",25,5,0,0),
("关总线",26,1,0,0),
("将缓存区数据写入OTP",27,5,3,0),
("写入三码数据",28,5,0,0),
("验证三码数据",29,5,0,0),
("测量电容压差",30,2,1,1),
("测量桥丝阻值",31,4,1,1),
("使能OTP写",32,5,0,0),
("写模块版本",33,5,1,0),
("读取版本号",34,5,0,1),
("写缓存数据",35,5,3,0),
("验证缓存数据",36,5,3,0),
("验证延时时间",37,5,0,0),
("切换总线极性",38,5,2,0),
("计算异常",39,0,10,0),
("重新执行任务",40,0,1,0),
("配置三码数据到小板",41,1,10,0),
("任务插槽",42,1,1,0),
("设置电阻校准值",43,1,1,0),
("写入流水号",44,5,2,0),
("读取流水号",45,5,2,2),
("写固定延时",46,5,1,0),
]
# task_id,errcode,par_count,ret_count
_g_ext_task_table=[
("计算异常",100,0,10,0),
("重新执行任务",101,0,1,0),
("配置三码数据到小板",102,1,10,0),
("任务插槽",103,1,1,0),
("设置电阻校准值",104,1,1,0),
]
# 组装和解析应用层协议
# 填充指定个数的byte
def arr_byte_copy(byte:int,num:int):
t=bytearray()
for i in range(num):
t.append(byte)
return t
# 根据字符找到任务,失败返回nullptr
def coder_find_task(name:str,chip:int):
table=None
print("find task in ext_table.")
table=_g_ext_task_table
for i in table:
if(i[0]==name):
return i
table=None
if(chip==0):
table=_g_jq_task_table
print("find task in jq_table.")
elif(chip==2):
table=_g_ew_task_table
print("find task in ew_table.")
if(table is None):
return None
for i in table:
if(i[0]==name):
print("find task index=%d.",i)
return i
return None
# 添加一个任务,返回0添加成功
def coder_add_task(d:bytearray,chip:int,name:str,slot_index:int,task_index:int,params:list):
task=None
task=coder_find_task(name,chip)
if(task is None):
print(f"can not find task with {name}")
return -1
else:
# task_id,errcode,par_count,ret_count
print(f"task_name:{name},task_id={task[1]},par_count={task[3]},ret_count={task[4]},err={task[2]}")
d.append(0xff&(slot_index))
d.append(0xff&(task[1]))
d.append(0xff&(task[3]))
d.append(0xff&(task[4]))
d.append(0xff&(task[2]))
d.append(0xff&(task_index))
if(task[3]>0):
for i in params:
d.append(i&0xff)
d.append((i>>8)&0xff)
return 0
# 包装为一个小板的数据,返回0成功
# 包装前需要先添加任务
def coder_slave_pack(d:bytearray,addr:int):
d_len=len(d)
d.insert(0,0xff&(d_len))
d.insert(0,0xff&(addr))
return 0
# 找到指定任务序号的数据
def coder_slave_find_ret_data(data:bytearray,task_index:int,size:int):
r=bytearray()
for i in range(len(data)):
if(data[i]==task_index):
r=data[i+2,data[i+1]+i+2]
break
i+=2+data[i+1]
if(len(r)>=size):
r=r[:size]
else:
r_len=size-len(r)
r+=arr_byte_copy(0,r_len)
return r
# 添加分包信息
def coder_pack(d:bytearray):
d_len=len(d)
if(d_len>236):
return None
r=bytearray()
r.append(d_len)
r.append(0)
r.append(0)
r.append(d_len)
r+=d
return r
# 运行检测并读取工厂信息任务
def coder_check_read_fatinfo(chip:int):
d=bytearray()
if(chip==0):
coder_add_task(d,chip,"读OTP",1,1,[20,4])
elif(chip==2):
coder_add_task(d,chip,"读MTP",1,1,[9,4])
coder_add_task(d,chip,"读延时",1,2,[])
coder_slave_pack(d,0x1f)
# 检测模式1,返回异常代码和任务插槽数据
d.insert(0,1)
return coder_pack(d)
# 解析读取到的工厂信息
def coder_check_decode_fatinfo(data:bytearray):
r=bytearray()
data=data[1:]
sret=coder_slave_find_ret_data(data[1:],1,4)
if(len(sret)==4):
sn=sret[0]|(sret[1]<<8)|(sret[2]<<16)|(sret[3]<<24)
c_type=sn&0x1f
sn=sn>>5
print(f"模块类型:{c_type},流水号:{sn}")
sret=coder_slave_find_ret_data(data[1:],2,2)
if(len(sret)==2):
delay=sret[0]|(sret[1]<<8)
print(f"延时:{delay}")
# 运行检测并写入流水号
def coder_check_write_sn(chip:int,sn:int):
d=bytearray()
params=[]
params.append(sn&0xffff)
params.append((sn>>16)&0xffff)
coder_add_task(d,chip,"写入流水号",1,1,params)
coder_add_task(d,chip,"读取流水号",2,2,params)
coder_slave_pack(d,0x1f)
# 检测模式1,返回异常代码和任务插槽数据
d.insert(0,1)
return coder_pack(d)
# 解析读取到的流水号
def coder_check_decode_sn(data:bytearray):
r=bytearray()
data=data[1:]
sret=coder_slave_find_ret_data(data[1:],2,4)
if(len(sret)==4):
sn=sret[0]|(sret[1]<<8)|(sret[2]<<16)|(sret[3]<<24)
print(f"流水号:{sn}")
if __name__ == "__main__":
u=pt.protu()
# 检测并写入流水号
data=coder_check_write_sn(0,12345)
# 检测并读取工厂信息和延时
# data=coder_check_read_fatinfo(0)
# data=bytearray.fromhex("0d 00 00 0d 01 1f 0a 01 18 02 0a 05 01 14 00 04 00")
u.cmd=0x21
data=u.encode(data)
print(data.hex(' '))
# def fun():
# return "fun_test"
# d={"fun":fun
# }
# print(d["fun"]())