Files
coder_stm32f1/source/prebuild.py
ranchuan bf440a35bc 取消急停时如果不在空闲状态才跳到另一侧
心跳数据在收到回复之后也会继续发送
    芯片异常时不检测电容
    str_is_print_str 函数中,len为0时返回0
    改版本号为0.03
2023-09-20 18:30:04 +08:00

154 lines
4.1 KiB
Python

import sys
import os
import datetime
from datetime import datetime, timedelta
# 定义软件版本号
SOFT_VERION = "0.03"
# 定义mod文件的名称和路径
MOD_FILE="mod_signals.c"
MOD_PATH="./source/task/"
INFO_FILE="./source/main/compiler_info.h"
# 找到文件夹中指定后缀的文件
def find_file(path:str,fix:str):
file_list=[]
for file_name in os.listdir(path):
if file_name.endswith(fix):
file_list.append(os.path.join(path, file_name))
return file_list
# 找到 signal 关键字 定义的行
def find_signal_def(file):
list_signal=[]
with open(file,encoding="utf-8") as f:
list_str=f.readlines()
for i in list_str:
if(i[0:6]=="signal"):
list_signal.append(i)
return list_signal
# 截取参数列表中的变量名
def split_par_name(par_str:str):
ret_str=""
if(par_str.count('*')>0):
ret_str=par_str.split("*")[1].strip()
else:
ret_str=par_str.split(" ")[1]
return ret_str
# 生成一个信号函数的实现
def def_signal_fun(line:str):
# 删除多余空格
line=' '.join(line.split())
# print(line)
list_str=line.split('(')
fun_name=list_str[0].split(' ')[1]
param_str=list_str[1].split(')')[0]
params=[]
# 有","则至少有两个参数否则可能有一个参数,可能没有
if(param_str.count(',')>0):
params=param_str.split(',')
for i in range(len(params)):
params[i]=params[i].strip()
else:
t_str=param_str.strip()
if(len(t_str)>0)and(t_str!="void"):
params.append(t_str)
# print(fun_name,params)
params_num=len(params)
fun_str=""
fun_str+="void "+fun_name+"("
for i in range(params_num):
fun_str+=params[i]
if(i<len(params)-1):
fun_str+=","
fun_str+=")\n{\n"
if(params_num-1>0):
fun_str+=" uint32_t param[{d}];\n".format(d=params_num-1)
for i in range(params_num-1):
fun_str+=" param[{d1}]=(uint32_t){d2};\n".format(d1=i,d2=split_par_name(params[i+1]))
if(params_num-1>0):
fun_str+=" _signal_emit({d1},{d2},param,{d3});\n".format(d1=split_par_name(params[0]),d2=fun_name,d3=params_num-1)
else:
fun_str+=" _signal_emit({d1},{d2},0,{d3});\n".format(d1=split_par_name(params[0]),d2=fun_name,d3=params_num-1)
fun_str+="}\n"
fun_str+="signal_export({d});\r\n\r\n\r\n\r\n".format(d=fun_name)
# print(fun_str)
return fun_str
# 遍历路径中的 .h 文件 返回找到的文件和信号声明
def ergodic_signal_fun(path):
fun_str=""
list_file=find_file(path,".h")
for i in list_file:
list_signal=find_signal_def(i)
for j in list_signal:
fun_str+=def_signal_fun(j)
return list_file,fun_str
# 创建 mod 文件
def mod_file_creat(file_path):
with open(file_path,"w+") as f:
list_file,fun_str=ergodic_signal_fun(MOD_PATH)
f.write("#include \"stdlib.h\"\n")
f.write("#include \"signal.h\"\n")
for i in list_file:
f.write("#include \""+i.split("/")[-1]+"\"\n")
f.write("\n\n\n\n\n\n")
f.write(fun_str)
# 获取北京时间
def get_date():
now_time = datetime.utcnow()
utc_time = now_time + timedelta(hours=8) # UTC只是比北京时间提前了8个小时
utc_time = utc_time.strftime("%Y%m%d")
return utc_time
# 获取北京时间
def get_time():
now_time = datetime.utcnow()
utc_time = now_time + timedelta(hours=8) # UTC只是比北京时间提前了8个小时
utc_time = utc_time.strftime("%Y-%m-%d %H:%M:%S")
return utc_time
# 生成编译信息头文件
def creat_compile_info(dst:str):
utc_time=get_time()
if os.path.exists(dst):
os.remove(dst)
with open(dst,"w") as f:
f.write("#ifndef compiler_info__\n")
f.write("#define compiler_info__\n\n\n\n\n\n\n")
f.write("#define BUILD_DATE \""+utc_time+"\"\n")
f.write("#define SOFT_VERSION \""+SOFT_VERION+"\"\n")
f.write("\n\n\n\n\n\n\n#endif\n")
def main():
creat_compile_info(INFO_FILE)
mod_file_creat(MOD_PATH+MOD_FILE)
print("prepare success.\n")
if __name__=="__main__":
main()