| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import datetime | 
					
						
							|  |  |  | from datetime import datetime, timedelta | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-03 18:27:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # 定义软件版本号 | 
					
						
							|  |  |  | SOFT_VERION = "0.10" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  | # 定义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") | 
					
						
							| 
									
										
										
										
											2023-07-03 18:27:10 +08:00
										 |  |  |         f.write("#define SOFT_VERSION  \""+SOFT_VERION+"\"\n") | 
					
						
							| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  |         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() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |