'''
输入:EB配置中的CAN模块描述文件 can.xdm,在此文件中最好先配置最少一帧的收发报文
示例的CANhardware 接收及发送的object配置信息
输出:接收和发送报文hardware object元素数量
功能:根据CANhardware示例结构,根据各路CAN的收发报文数量,自动生成对应数量的
hariware配置数量,手动把结构体集成到xdm中
'''
import re
import tkinter
import tkinter.messagebox
rx_can_id_value_lis = []
rx_can_object_id_lis = []
rx_can_node_lis = []
rx_can_type_lis = []
tx_can_id_value_lis = []
tx_can_object_id_lis = []
tx_can_node_lis = []
tx_can_type_lis = []
'''配置各个通道tx及RX报文的数量'''
rx_object_cnt_list = [2, 2]
tx_object_cnt_list = [2, 2]
step = 0
step_cnt = 0
line_cnt = 0
line_xdm_cnt = 0
xdm_step = 0
rx_message_num = 0
tx_message_num = 0
object_cnt = 0
can_channel = 0
can_index_in_channel = 0
can_objectid = 0
can_rxid = 0
file_handle_des = open('.\Output\' + 'generated_code.txt', 'w+')
file_handle_input_rx = open('.\Files\' + 'rxinput.txt', 'r')
file_source_lines_rx = file_handle_input_rx.readlines()
file_handle_input = open('.\Files\' + 'txinput.txt', 'r')
file_source_lines = file_handle_input.readlines()
# 修改此处的循环范围为1到8,以适配8个CAN通道
for can_channel in range(1, 3):
can_rxid = 0x18FF0000 + 0X100 * can_channel + can_index_in_channel
can_index_in_channel = 0
for can_index_in_channel in range(rx_object_cnt_list[can_channel - 1]):
line_cnt = 0
while line_cnt < len(file_source_lines_rx):
if line_cnt == 0:
file_handle_des.write(' <d:ctr name="CanHardwareObject_' + str(can_objectid) + '_CAN' + str(can_channel) + '_RX_' + str(can_index_in_channel) + '" type="IDENTIFIABLE">\n')
elif line_cnt == 22:
file_handle_des.write(' <d:var name="CanObjectId" type="INTEGER" value="' + str(can_objectid) + '">\n')
elif line_cnt == 32:
file_handle_des.write(' <d:var name="CanMbIdex" type="INTEGER" value="' + str(can_index_in_channel) + '"/>\n')
elif line_cnt == 46:
file_handle_des.write(' value="ASPath:/Can/Can/CanConfigSet/ControllerCan' + str(can_channel) + '"/>\n')
elif line_cnt == 57:
file_handle_des.write(' value="' + str(can_rxid) + '"/>\n')
else:
line = file_source_lines_rx[line_cnt]
file_handle_des.write(line)
line_cnt = line_cnt + 1
can_objectid = can_objectid + 1
can_rxid = can_rxid + 1
for can_channel in range(1, 3):
can_index_in_channel = 0
for can_index_in_channel in range(tx_object_cnt_list[can_channel - 1]):
line_cnt = 0
while line_cnt < len(file_source_lines):
if line_cnt == 0:
file_handle_des.write(' <d:ctr name="CanHardwareObject_' + str(can_objectid) + '_CAN' + str(can_channel) + '_TX_' + str(can_index_in_channel) + '" type="IDENTIFIABLE">\n')
elif line_cnt == 25:
file_handle_des.write(' <d:var name="CanObjectId" type="INTEGER" value="' + str(can_objectid) + '">\n')
elif line_cnt == 38:
file_handle_des.write(' <d:var name="CanMbIdex" type="INTEGER" value="' + str(can_index_in_channel) + '"/>\n')
elif line_cnt == 52:
file_handle_des.write(' value="ASPath:/Can/Can/CanConfigSet/ControllerCan' + str(can_channel) + '"/>\n')
else:
line = file_source_lines[line_cnt]
file_handle_des.write(line)
line_cnt = line_cnt + 1
can_objectid = can_objectid + 1
file_handle_des.close()