Files
coder_stm32f1/source/mycopy.py
ranchuan 9f7ac06880 输入通道改为实际使用通道
编译后自动添加到数据库
2023-09-11 17:46:30 +08:00

175 lines
4.4 KiB
Python
Raw 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 shutil
import sys
import os
import prebuild as time
import mysql
# 定义app和boot文件路径(没有尾缀)
APP_FILE_SRC = "./Objects/app/coder_2channel_app"
BOOT_FILE_SRC = "./Objects/boot/coder_2channel_boot"
# APP_FILE_DST = "./Objects/coder_2channel_app"
APP_FILE_DST = "./python/file/coder_2channel_app"
BOOT_FILE_DST = "./Objects/coder_2channel_boot"
# 定义app和boot的数据库目录
SQL_APP_PATH = "coder_stm32f1_app"
SQL_BOOT_PATH = "coder_stm32f1_boot"
# 找到指定后缀的文件
def find_type(fix:str):
path = os.getcwd()
#print(path)
list=os.listdir(path)
file_list=[]
for i in list:
if(i[-len(fix):]==fix):
file_list.append(i)
return file_list
# 把ext_name打包到name之后
def pack_file(name,ext_name):
with open(name, "ab") as f:
data=bytearray(256)
data[4:len(ext_name)+4]=bytearray(ext_name,"utf-8")
with open(ext_name,"rb") as g:
g.seek(0, os.SEEK_END)
size=g.tell()+256
g.seek(0, os.SEEK_SET)
data[0]=size&0xff
data[1]=(size>>8)&0xff
data[2]=(size>>16)&0xff
data[3]=(size>>24)&0xff
print("name:",ext_name,"size=",size)
f.write(data)
f.write(g.read())
def crc32(data:bytearray):
temp=0
crc=0xffffffff
i=0
if(len(data)%4!=0):
return 0
while(i<len(data)):
temp=data[i]|(data[i+1]<<8)|(data[i+2]<<16)|(data[i+3]<<24)
i+=4
for j in range(32):
if((crc^temp)&0x80000000)!=0:
crc=0x04c11db7^(crc<<1)
else:
crc<<=1
temp<<=1
crc&=0xffffffff
return crc
# 运行地址为 0x08004000
# 添加一个128byte为本程序添加的数据头
# 数据头定义:
# 固件大小(4byte,不包含文件头)
# 打包时间(20byte,字符串,本程序创建的时间)
# CRC(4byte,整个固件的crc,计算crc不包含文件头)
# 本机IP地址(4byte,按字节为单位依次存储ip地址)
# 主机IP地址(4byte,同上)
# 主机TCP端口(4byte)
# 与主机的通信接口(8byte,字符串)
# 不足128byte的补0
# 填充指定个数的byte
def arr_byte_copy(byte:int,num:int):
t=bytearray()
for i in range(num):
t.append(byte)
return t
# int转数组
def arr_from_int(num:int):
return bytearray([num&0xff,(num>>8)&0xff,(num>>16)&0xff,(num>>24)&0xff])
# 字符串转数组不足填充0
def arr_from_str(txt:str,num:int):
t=bytearray(txt.encode(encoding="utf-8"))
t+=arr_byte_copy(0,num-len(t))
return t
# ip地址转数组
def arr_from_ip(ip:str):
nums=ip.split('.')
t=bytearray()
t.append(int(nums[0]))
t.append(int(nums[1]))
t.append(int(nums[2]))
t.append(int(nums[3]))
return t
# 创建数据头
def creat_head(data:bytearray,date:str):
head=bytearray()
head+=arr_from_int(len(data))
head+=arr_from_str(date,20)
head+=arr_from_int(crc32(data))
head+=arr_from_ip("192.168.80.10")
head+=arr_from_ip("192.168.80.100")
head+=arr_from_int(7777)
head+=arr_from_str("utcp",8)
head+=arr_byte_copy(0,128-len(head))
# print(head)
return head
def main():
date=time.get_date()
src=APP_FILE_SRC+".bin"
dst=APP_FILE_DST+"_"+date+".pkt"
if not os.path.exists(src):
print(src+' File Error!!!')
else:
if os.path.exists(dst):
os.remove(dst)
file = open(src,"rb")
data = file.read()
print("File Size is :", len(data))
file.close()
head=creat_head(data,time.get_time())
data=head+data
with open(dst,"wb") as f:
f.write(data)
print(dst+' create app file success.')
sql=mysql.sql()
if(sql.init(SQL_APP_PATH)==True):
sql.insert(dst)
boot=BOOT_FILE_SRC+".bin"
boot_dst=BOOT_FILE_DST+"_"+date+".bin"
if os.path.exists(boot):
d=bytearray()
with open(boot,"rb") as f:
d+=f.read()
d+=arr_byte_copy(0xff,0x4000-len(d))
with open(src,"rb") as f:
d+=f.read()
if os.path.exists(boot_dst):
os.remove(boot_dst)
with open(boot_dst,"wb") as f:
f.write(d)
print(boot_dst+" create boot file success.")
sql=mysql.sql()
if(sql.init(SQL_BOOT_PATH)==True):
sql.insert(boot_dst)
else:
print("please build bootloader to create boot file")
if __name__=="__main__":
main()