嵌入式框架模板构建方案
关键内容
实战演习
import yaml
from mako.template import Template
import os
def deep_merge_dict(dict1, ditc2):
for key in ditc2:
if key not in dict1:
dict1.setdefault(key, ditc2[key])
else:
if isinstance(ditc2[key], dict):
deep_merge_dict(dict1[key], ditc2[key])
else:
pass
def load_yaml(dir_):
fn_dic = {}
os.chdir(os.getcwd())
for dir_lst in os.walk(dir_):
fn_lst = dir_lst[2];
for fn in fn_lst:
if fn.endswith('.yml'):
fn_path = dir_lst[0] + '\\' + fn;
if fn_path not in fn_dic:
fn_dic.setdefault(fn, fn_path);
else:
print("- Error: 1");
else:
pass
return fn_dic
yaml_path = load_yaml("src")
data = {}
for key in yaml_path:
yaml_fs = open(yaml_path[key], 'r', encoding = "utf-8")
yaml_data = yaml_fs.read()
yaml_fs.close()
data1 = yaml.load(yaml_data)
deep_merge_dict(data, data1)
l_data = data[':RSTMGR']['RST'].copy()
for key in l_data:
if isinstance(l_data[key]['PRIO'], str):
if l_data[key]['PRIO'] == 'LOW':
l_data[key]['PRIO'] = -1
elif l_data[key]['PRIO'] == 'HIGH':
l_data[key]['PRIO'] = 0xFFFFFFFF
else:
print("err-----")
t_data = sorted(l_data.items(), key=lambda x:x[1]['PRIO'], reverse=True)
t = Template(filename = "test.tpl.c", module_directory = "C:/Python34/tpl")
f = open("test.txt", 'w')
txt = t.render(data = data, t_data = t_data)
txt = txt.replace('\r', '')
f.write(txt)
f.close()
资源文件.yml
:RSTMGR:
RST:
Test:
OWNER: Test
PRIO: 100
FNCT: Test_vReset
:RESMGR:
INIT:
ActiveBios:
Test:
OWNER: Test
PRIO: 100
FNCT: Test_vInit
ActiveIgn:
Test:
OWNER: Test
PRIO: 100
FNCT: Test_vInitIgn
:CYCMGR:
CYC:
CYCMGR_nen100ms:
Test:
OWNER: Test
PRIO: 100
FNCT: Test_vMain
DEPCY_RESON: [ActiveIgn]
DEPCY_RESOFF: []
:EVMGR:
EVENT:
TestUpdate:
OWNER: Test
模板
<%def name="print_k(area, i=0)">\
% for k in area:
<%_str = "--" * i%>\
% if isinstance(area[k], dict):
${_str}${k}:
<%print_k(area[k], i+1)%>\
% else:
${_str}${k}: ${area[k]}
% endif
% endfor
</%def>
${print_k(data)}
% for i in range(0, len(t_data)):
${t_data[i][1]['FNCT']}, /* RST_${t_data[i][1]['OWNER']} */
%endfor