diff --git a/pyren3/acf.py b/pyren3/acf.py index eaefdc7..0baab58 100755 --- a/pyren3/acf.py +++ b/pyren3/acf.py @@ -6,6 +6,7 @@ import mod_db_manager import mod_utils from mod_optfile import * from mod_scan_ecus import families as families +from mod_scan_ecus import findTCOM as findTCOM os.chdir(os.path.dirname(os.path.realpath(sys.argv[0]))) @@ -202,7 +203,7 @@ def main(): mod_utils.chkDirTree() mod_db_manager.find_DBs() - '''Check direcories''' + '''Check directories''' if not os.path.exists('../BVMEXTRACTION'): print("Can't find MTC database. (../BVMEXTRACTION)") exit() @@ -214,8 +215,6 @@ def main(): if mod_globals.opt_speed0: # demo mode with predefined ecu list se.read_Uces_file( all = True ) @@ -297,7 +303,10 @@ def main(): if 'mo' in list(m.keys()) and m['mo']!='': print("%2s : %s : %s" % (m['idf'],m['sref'],m['mo'].NOM)) - acf_MTC_generateDefaults( m, mtc ) + attr = [] + if platform in pl_id.keys() and m['idf'] in pl_id[platform].keys(): + attr = pl_id[platform][m['idf']] + acf_MTC_generateDefaults( m, mtc, attr ) #acf_MTC_findDiff( m, mtc, elm ) else: diff --git a/pyren3/mod_acf_proc.py b/pyren3/mod_acf_proc.py index ab6fbcf..cf3e194 100644 --- a/pyren3/mod_acf_proc.py +++ b/pyren3/mod_acf_proc.py @@ -6,6 +6,7 @@ import time import mod_globals import mod_elm import shutil +import pickle from mod_mtc import acf_MTC_finde from mod_mtc import acf_MTC_and @@ -68,7 +69,7 @@ def acf_form_commands( m, cu, op ): m['acf_wc'][cu.RW] = acf_pack_command( True, ace.req[cu.RW], cu.DW, m['acf_wc'][cu.RW], op.TW, op.MW) ace.req[cu.RW].SentDI[cu.DW].val = op.VW + ' #[' + cu.TE + ' : ' + op.TEX + '](' + op.MTC + ')' -def acf_MTC_generateDefaults( m, mtc ): +def acf_MTC_generateDefaults( m, mtc, attr ): """ m - module definition map """ ''' mtc - list of options ''' ''' this function generates default values''' @@ -136,14 +137,26 @@ def acf_MTC_generateDefaults( m, mtc ): sf = open(scriptn,'wt') #print "--------------- Write Commands --------------------" + attr = list(attr) + attr_dst = '' + attr_ses = '' + if len(attr)>0: + attr_dst, attr_ses = attr[0].split('#') + if len(attr)>1: + attr_dst = attr_dst + ' #' + attr_ses = attr_ses + ' #' + for a in attr[1:]: + dst,ses = a.split('#') + attr_dst = attr_dst + ' ' + dst + attr_ses = attr_ses + ' ' + ses # write preamble sf.write('# ' + mod_globals.vin + '\n\n') - sf.write('$addr = ' + m['dst'] +'\n\n') + sf.write('$addr = ' + attr_dst +'\n\n') sf.write('can500 # init can macro\n\n') sf.write('delay 1\n\n') sf.write('# open session\n') - sf.write('session ' + m['startDiagReq'] + '\n\n') + sf.write('session ' + attr_ses + '\n\n') sf.write('# configuration\n') # save write commands diff --git a/pyren3/mod_mtc.py b/pyren3/mod_mtc.py index 868cbda..a7dc2ff 100644 --- a/pyren3/mod_mtc.py +++ b/pyren3/mod_mtc.py @@ -68,14 +68,20 @@ def acf_buildFull( platf ): return mtc = {} - mtcf = open(plDIR+'/MTC.dat', 'rt') + mtc_name = 'MTC.dat' + for fn in os.listdir(plDIR): + if fn.upper()=='MTC.DAT': mtc_name = fn + mtcf = open(plDIR + '/' + mtc_name, 'rt') mtc_list = csv.reader(mtcf, delimiter=';') for i in mtc_list: if i: mtc[int(i[0][:-4])] = i[1:] ref = {} - reff = open(plDIR+'/REF.dat', 'rt') + ref_name = 'REF.dat' + for fn in os.listdir(plDIR): + if fn.upper()=='REF.DAT': ref_name = fn + reff = open(plDIR + '/' + ref_name, 'rt') ref_list = csv.reader(reff, delimiter=';') for i in ref_list: if i: @@ -205,7 +211,10 @@ def acf_getMTC( VIN, preferFile=False ): #check if there is an mtc file - mz = open(vindir+'MTC.dat','r') + mtc_name = 'MTC.dat' + for fn in os.listdir(vindir): + if fn.upper()=='MTC.DAT': mtc_name = fn + mz = open(vindir+mtc_name,'r') mtclist = mz.read().split('\n') mz.close() for l in mtclist: @@ -213,7 +222,10 @@ def acf_getMTC( VIN, preferFile=False ): mtcdata = l try: - rz = open(vindir+'REF.dat','r') + ref_name = 'REF.dat' + for fn in os.listdir(vindir): + if fn.upper()=='REF.DAT': ref_name = fn + rz = open(vindir+ref_name,'r') reflist = rz.read().split('\n') rz.close() for l in reflist: diff --git a/pyren3/mod_scan_ecus.py b/pyren3/mod_scan_ecus.py index ce61c00..84a4c79 100755 --- a/pyren3/mod_scan_ecus.py +++ b/pyren3/mod_scan_ecus.py @@ -999,8 +999,9 @@ def readECUIds( elm ): return StartSession, DiagVersion, Supplier, Version, Soft, Std, VIN -def findTCOM( addr, cmd, rsp ): +def findTCOM( addr, cmd, rsp, pl_id = False ): ecuvhc = {} + pl_id = {} vehicle = '' print('Read models') file_list = mod_db_manager.get_file_list_from_clip('Vehicles/TCOM_*.[Xx]ml') @@ -1013,7 +1014,7 @@ def findTCOM( addr, cmd, rsp ): vehTypeCode = vh.getAttribute("vehTypeCode") vehTCOM = vh.getAttribute("TCOM") vehicle = vehiclename+'#'+vehTCOM; - + pl_id[vehTypeCode] = {} #print vehicle connector = vh.getElementsByTagName("Connector") @@ -1024,9 +1025,13 @@ def findTCOM( addr, cmd, rsp ): if eculist: ecukind = eculist.item(0).getElementsByTagName("EcuKind") for ek in ecukind: + id = ek.getAttribute("idFamily") + pl_id[vehTypeCode][id] = {} + pl_id[vehTypeCode][id]['refs'] = [] ecuref = ek.getElementsByTagName("EcuRef") for er in ecuref: ecuname = er.getAttribute("name") + pl_id[vehTypeCode][id]['refs'].append(ecuname) if ecuname in list(ecuvhc.keys()): ecuvhc[ecuname].append(vehicle) else: @@ -1036,9 +1041,14 @@ def findTCOM( addr, cmd, rsp ): if eculist: ecukind = eculist.item(0).getElementsByTagName("EcuKind") for ek in ecukind: + id = ek.getAttribute("idFamily") + if id not in pl_id[vehTypeCode].keys(): + pl_id[vehTypeCode][id] = {} + pl_id[vehTypeCode][id]['refs'] = [] ecuref = ek.getElementsByTagName("EcuRef") for er in ecuref: ecuname = er.getAttribute("name") + pl_id[vehTypeCode][id]['refs'].append(ecuname) if ecuname in list(ecuvhc.keys()): ecuvhc[ecuname].append(vehicle) else: @@ -1047,15 +1057,34 @@ def findTCOM( addr, cmd, rsp ): se = ScanEcus( None ) print('Loading Uces.xml') se.read_Uces_file(True) - #print ecuvhc - for r in list(se.allecus.keys()): - if se.allecus[r]['dst']!=addr: continue - if se.allecus[r]['ids'][0]!=cmd: continue - if se.compare_ecu( se.allecus[r]['ids'], rsp, cmd ): - try: - print(r, se.allecus[r]['doc'], se.allecus[r]['ids'], ecuvhc[r]) - except: - print() + + if pl_id: + #save pl_id + for pl in pl_id.keys(): + for id in pl_id[pl].keys(): + attr = set() + for r in pl_id[pl][id]['refs']: + if r in se.allecus.keys(): + #attr.add(se.allecus[r]['stdType']+"#"+se.allecus[r]['dst']+"#"+se.allecus[r]['startDiagReq']) + attr.add(se.allecus[r]['dst']+"#"+se.allecus[r]['startDiagReq']) + #else: + # print(r) + del pl_id[pl][id]['refs'] + pl_id[pl][id] = attr + pickle.dump( pl_id, open( './cache/pl_id_attr.p', "wb" ) ) + else: + #print found ecus + for r in list(se.allecus.keys()): + if se.allecus[r]['dst']!=addr: continue + if se.allecus[r]['ids'][0]!=cmd: continue + if se.compare_ecu( se.allecus[r]['ids'], rsp, cmd ): + try: + print(r, se.allecus[r]['doc'], se.allecus[r]['ids'], ecuvhc[r]) + except: + print() + + + def generateSavedEcus( eculist, fileName ): se = ScanEcus( 0 ) se.read_Uces_file( all = True ) @@ -1078,6 +1107,8 @@ if __name__ == "__main__": mod_db_manager.find_DBs() + #findTCOM( '', '', '', pl_id=True) + # 10016,10074 savedEcus.p_gen if len(sys.argv)==3: generateSavedEcus( sys.argv[1], sys.argv[2] )