add date to timestamp of logs, change in csv format, change timeout during long command writing

This commit is contained in:
shrlnm 2023-05-30 20:59:34 +03:00
parent 5dc5693c51
commit 8cb0852249
3 changed files with 51 additions and 66 deletions

View File

@ -412,26 +412,21 @@ class ECU:
if mod_globals.opt_csv and mod_globals.ext_cur_DTC == '000000': if mod_globals.opt_csv and mod_globals.ext_cur_DTC == '000000':
# prepare to csv save # prepare to csv save
self.minimumrefreshrate = 0 self.minimumrefreshrate = 0
csvline = "sep=\\t\n" #csvline = "sep=\\t\n"
csvline += "Time" csvline = "Time"
nparams = 0 nparams = 0
for dr in datarefs: for dr in datarefs:
if dr.type=='State': if dr.type=='State':
if mod_globals.opt_csv_only:
csvline += ";" + self.States[dr.name].codeMR
else:
csvline += ";" + self.States[dr.name].codeMR + ":" + self.States[dr.name].label csvline += ";" + self.States[dr.name].codeMR + ":" + self.States[dr.name].label
nparams += 1 nparams += 1
if dr.type=='Parameter': if dr.type=='Parameter':
if mod_globals.opt_csv_only:
csvline += ";" + self.Parameters[dr.name].codeMR
else:
csvline += (";" + self.Parameters[dr.name].codeMR + ":" +self.Parameters[dr.name].label + " [" + self.Parameters[dr.name].unit + "]") csvline += (";" + self.Parameters[dr.name].codeMR + ":" +self.Parameters[dr.name].label + " [" + self.Parameters[dr.name].unit + "]")
nparams += 1 nparams += 1
if mod_globals.opt_usrkey: csvline += ";User events" if mod_globals.opt_usrkey: csvline += ";User events"
csvline = pyren_encode(csvline) csvline = pyren_encode(csvline)
if nparams: if nparams:
csv_filename = datetime.now().strftime("%y_%m_%d_%H_%M_%S") csv_start_time = datetime.now().timestamp()
csv_filename = datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
#here the problem with russian letters. and very long name #here the problem with russian letters. and very long name
csv_filename = csv_filename+'_'+self.ecudata['ecuname']+'_'+path csv_filename = csv_filename+'_'+self.ecudata['ecuname']+'_'+path
csv_filename += ".csv" csv_filename += ".csv"
@ -485,16 +480,12 @@ class ECU:
if mod_globals.opt_csv_human and csvf!=0: if mod_globals.opt_csv_human and csvf!=0:
csvline = csvline + "\n" csvline = csvline + "\n"
#csvline = csvline.replace('.',',') csvline = csvline.replace(',','.')
#csvline = csvline.replace(',','.') csvline = csvline.replace(';',',')
csvline = csvline.replace(';','\t')
csvf.write(pyren_decode(csvline).encode('utf8')) csvf.write(pyren_decode(csvline).encode('utf8'))
#if mod_globals.os == 'nt' or mod_globals.os == 'android':
# csvf.write(pyren_decode(csvline).encode('cp1251') if mod_globals.opt_csv_human else csvline)
#else:
# csvf.write(pyren_decode(csvline).encode('utf8') if mod_globals.opt_csv_human else csvline)
csvf.flush() csvf.flush()
csvline = datetime.now().strftime("%H:%M:%S.%f") time_delata = datetime.now().timestamp()-csv_start_time
csvline = datetime.fromtimestamp(time_delata).strftime("%S.%f")[:-3]
#Collect all the requests from the current screen #Collect all the requests from the current screen
if mod_globals.opt_performance and self.elm.performanceModeLevel > 1 and mod_globals.opt_csv_only: if mod_globals.opt_performance and self.elm.performanceModeLevel > 1 and mod_globals.opt_csv_only:
@ -660,6 +651,9 @@ class ECU:
clearScreen() clearScreen()
print('Generating a file. Please wait...') print('Generating a file. Please wait...')
if len(responseHistory):
startTime = next(iter(responseHistory))
for reqTime, reqCache in responseHistory.items(): for reqTime, reqCache in responseHistory.items():
for req, rsp in reqCache.items(): for req, rsp in reqCache.items():
if req.startswith('22') and len(req) > 6: if req.startswith('22') and len(req) > 6:
@ -670,10 +664,11 @@ class ECU:
self.elm.rsp_cache[req] = rsp self.elm.rsp_cache[req] = rsp
csvline = csvline + "\n" csvline = csvline + "\n"
csvline = csvline.replace(';','\t') csvline = csvline.replace(',','.')
csvline = csvline.replace(';',',')
csvf.write(pyren_decode(csvline).encode('utf8')) csvf.write(pyren_decode(csvline).encode('utf8'))
csvf.flush() csvf.flush()
csvline = datetime.fromtimestamp(reqTime/1000.0).strftime("%H:%M:%S.%f")[:-3] csvline = datetime.fromtimestamp((reqTime-startTime)/1000).strftime("%S.%f")[:-3]
for dr in datarefs: for dr in datarefs:
datastr = dr.name datastr = dr.name

4
pyren3/mod_ecu_state.py Executable file → Normal file
View File

@ -23,7 +23,11 @@ def get_state( st, mn, se, elm, calc, dataids = {} ):
else: else:
st.value = str(tmp_val) st.value = str(tmp_val)
if mod_globals.opt_csv and mod_globals.opt_csv_only:
csv_val = str(tmp_val)
else:
csv_val = str(st.value) csv_val = str(st.value)
if mod_globals.os=='android': if mod_globals.os=='android':
st.value = " "*(8-len(st.value)//2) + str(st.value) st.value = " "*(8-len(st.value)//2) + str(st.value)
return "%-6s %-41s %-16s"%(st.codeMR,st.label,st.value), st.helps, csv_val return "%-6s %-41s %-16s"%(st.codeMR,st.label,st.value), st.helps, csv_val

View File

@ -127,6 +127,8 @@ negrsp = {"10": "NR: General Reject",
"92": "NR: Voltage Too High", "92": "NR: Voltage Too High",
"93": "NR: Voltage Too Low"} "93": "NR: Voltage Too Low"}
def log_tmstr():
return datetime.now ().strftime ("%x %H:%M:%S.%f")[:21].ljust(21,'0')
# noinspection PyBroadException,PyUnresolvedReferences # noinspection PyBroadException,PyUnresolvedReferences
class Port: class Port:
@ -534,7 +536,7 @@ class ELM:
srvsDelay = 0 # the delay next command requested by service srvsDelay = 0 # the delay next command requested by service
lastCMDtime = 0 # time when last command was sent to bus lastCMDtime = 0 # time when last command was sent to bus
portTimeout = 5 # timeout of port (com or tcp) portTimeout = 5 # timeout of port (com or tcp)
elmTimeout = 0 # timeout set by ATST elmTimeout = 'FF' # timeout set by ATST
performanceModeLevel = 1 # number of dataids, that can be sent in one 22 request performanceModeLevel = 1 # number of dataids, that can be sent in one 22 request
# error counters # error counters
@ -608,8 +610,7 @@ class ELM:
self.ATCFC0 = mod_globals.opt_cfc0 self.ATCFC0 = mod_globals.opt_cfc0
if self.lf != 0: if self.lf != 0:
tmstr = datetime.now ().strftime ("%x %H:%M:%S.%f")[:-3] self.lf.write('#' * 60 + "\n#[" + log_tmstr() + "] Check ELM type\n" + '#' * 60 + "\n")
self.lf.write('#' * 60 + "\n#[" + tmstr + "] Check ELM type\n" + '#' * 60 + "\n")
self.lf.flush() self.lf.flush()
# check OBDLink # check OBDLink
@ -784,8 +785,7 @@ class ELM:
#self.mlf.write (line + '\n') #self.mlf.write (line + '\n')
#debug #debug
tmstr = datetime.now().strftime("%H:%M:%S.%f")[:-3] self.mlf.write(log_tmstr() + ' : ' + line + '\n')
self.mlf.write(tmstr + ' : ' + line + '\n')
if frameBuffLen >= coalescing_frames: if frameBuffLen >= coalescing_frames:
if self.monitorSendAllow is None or not self.monitorSendAllow.isSet (): if self.monitorSendAllow is None or not self.monitorSendAllow.isSet ():
@ -899,8 +899,7 @@ class ELM:
# save log # save log
if self.lf: if self.lf:
tmstr = datetime.now().strftime("%H:%M:%S.%f")[:-3] self.lf.write('mon: '+log_tmstr() + ' : ' + line + '\n')
self.lf.write('mon: '+tmstr + ' : ' + line + '\n')
if frameBuffLen >= coalescing_frames: if frameBuffLen >= coalescing_frames:
if self.monitorSendAllow is None or not self.monitorSendAllow.isSet(): if self.monitorSendAllow is None or not self.monitorSendAllow.isSet():
@ -1078,12 +1077,10 @@ class ELM:
# save log # save log
if self.vf != 0 and 'NR' not in rsp : if self.vf != 0 and 'NR' not in rsp :
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3]
tmp_addr = self.currentaddress tmp_addr = self.currentaddress
if self.currentaddress in list(dnat.keys()): if self.currentaddress in list(dnat.keys()):
tmp_addr = dnat[self.currentaddress] tmp_addr = dnat[self.currentaddress]
self.vf.write (tmstr + ";" + tmp_addr + ";" + req + ";" + rsp + "\n") self.vf.write (log_tmstr() + ";" + tmp_addr + ";" + req + ";" + rsp + "\n")
self.vf.flush () self.vf.flush ()
return rsp return rsp
@ -1122,8 +1119,7 @@ class ELM:
# log switching event # log switching event
if self.lf != 0: if self.lf != 0:
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3] self.lf.write ("#[" + log_tmstr() + "]" + "Switch to dev mode\n")
self.lf.write ("#[" + tmstr + "]" + "Switch to dev mode\n")
self.lf.flush () self.lf.flush ()
# If we are on CAN and there was more than keepAlive seconds of silence # If we are on CAN and there was more than keepAlive seconds of silence
@ -1132,8 +1128,7 @@ class ELM:
# log KeepAlive event # log KeepAlive event
if self.lf != 0: if self.lf != 0:
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3] self.lf.write ("#[" + log_tmstr() + "]" + "KeepAlive\n")
self.lf.write ("#[" + tmstr + "]" + "KeepAlive\n")
self.lf.flush () self.lf.flush ()
# send keepalive # send keepalive
@ -1188,8 +1183,7 @@ class ELM:
# log switching event # log switching event
if self.lf != 0: if self.lf != 0:
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3] self.lf.write ("#[" + log_tmstr() + "]" + "Switch back from dev mode\n")
self.lf.write ("#[" + tmstr + "]" + "Switch back from dev mode\n")
self.lf.flush () self.lf.flush ()
# add srvsDelay to time gap before send next command # add srvsDelay to time gap before send next command
@ -1205,13 +1199,11 @@ class ELM:
self.lf.write ("#[" + str (tc - tb) + "] rsp:" + line + ":" + negrsp[line[6:8]] + "\n") self.lf.write ("#[" + str (tc - tb) + "] rsp:" + line + ":" + negrsp[line[6:8]] + "\n")
self.lf.flush () self.lf.flush ()
if self.vf != 0: if self.vf != 0:
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3]
tmp_addr = self.currentaddress tmp_addr = self.currentaddress
if self.currentaddress in list(dnat.keys()): if self.currentaddress in list(dnat.keys()):
tmp_addr = dnat[self.currentaddress] tmp_addr = dnat[self.currentaddress]
self.vf.write (tmstr + ";" + tmp_addr + ";" + command + ";" + line + ";" + negrsp[line[6:8]] + "\n") self.vf.write (log_tmstr() + ";" + tmp_addr + ";" + command + ";" + line + ";" + negrsp[line[6:8]] + "\n")
self.vf.flush () self.vf.flush ()
return cmdrsp return cmdrsp
@ -1355,13 +1347,11 @@ class ELM:
# check for negative response (repeat the same as in cmd()) # check for negative response (repeat the same as in cmd())
if result[:2] == '7F' and result[4:6] in list(negrsp.keys ()): if result[:2] == '7F' and result[4:6] in list(negrsp.keys ()):
if self.vf != 0: if self.vf != 0:
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3]
#debug #debug
#print result #print result
self.vf.write ( self.vf.write (
tmstr + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[result[4:6]] + "\n") log_tmstr() + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[result[4:6]] + "\n")
self.vf.flush () self.vf.flush ()
return "NR:" + result[4:6] + ':' + negrsp[result[4:6]] return "NR:" + result[4:6] + ':' + negrsp[result[4:6]]
else: else:
@ -1419,9 +1409,8 @@ class ELM:
# print "Size error: ", result # print "Size error: ", result
if result[:2] == '7F' and result[4:6] in list(negrsp.keys()): if result[:2] == '7F' and result[4:6] in list(negrsp.keys()):
if self.vf != 0: if self.vf != 0:
tmstr = datetime.now().strftime("%H:%M:%S.%f")[:-3]
self.vf.write( self.vf.write(
tmstr + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[ log_tmstr() + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[
result[4:6]] + "\n") result[4:6]] + "\n")
self.vf.flush() self.vf.flush()
return "NR:" + result[4:6] + ':' + negrsp[result[4:6]] return "NR:" + result[4:6] + ':' + negrsp[result[4:6]]
@ -1626,9 +1615,8 @@ class ELM:
# print "Size error: ", result # print "Size error: ", result
if result[:2] == '7F' and result[4:6] in list(negrsp.keys()): if result[:2] == '7F' and result[4:6] in list(negrsp.keys()):
if self.vf != 0: if self.vf != 0:
tmstr = datetime.now().strftime("%H:%M:%S.%f")[:-3]
self.vf.write( self.vf.write(
tmstr + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[ log_tmstr() + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[
result[4:6]] + "\n") result[4:6]] + "\n")
self.vf.flush() self.vf.flush()
return "NR:" + result[4:6] + ':' + negrsp[result[4:6]] return "NR:" + result[4:6] + ':' + negrsp[result[4:6]]
@ -1670,21 +1658,24 @@ class ELM:
Fc = 0 # Current frame Fc = 0 # Current frame
Fn = len (raw_command) # Number of frames Fn = len (raw_command) # Number of frames
if Fn > 1 or len(raw_command[0])>15: # set elm timeout to 300ms for first response if Fn > 1 or len(raw_command[0])>15:
# corrected timeout RT * 1000ms / 4ms / 2 (on a half of RT) # set elm timeout to minimum among 3 values
corr_tout = int( 75 - (self.response_time * 125) ) # 1) 300ms constant
if corr_tout > 0x20: # 2) 2 * self.response_time in ms
cmdTxt = 'ATST' + hex(corr_tout)[-2:].zfill(2) # 3) 5s / (number of farmes in cmd)
self.send_raw(cmdTxt) min_tout = min( 300, 2*self.response_time*1000, 5000./(len(raw_command)+1))
else: # it seems too long roundtrip if min_tout<4:
self.send_raw('ATST20') min_tout = 4 # not less then 4ms
self.elmTimeout = hex(int(min_tout//4))[2:].zfill(2)
self.send_raw('ATST' + self.elmTimeout)
self.send_raw('ATAT1')
while Fc < Fn: while Fc < Fn:
# enable responses # enable responses
frsp = '' frsp = ''
if not self.ATR1: if not self.ATR1:
frsp = self.send_raw ('at r1') frsp = self.send_raw ('AT R1')
self.ATR1 = True self.ATR1 = True
tb = time.time () # time of sending (ff) tb = time.time () # time of sending (ff)
@ -1849,9 +1840,8 @@ class ELM:
#print "Size error: ", result #print "Size error: ", result
if result[:2] == '7F' and result[4:6] in list(negrsp.keys ()): if result[:2] == '7F' and result[4:6] in list(negrsp.keys ()):
if self.vf != 0: if self.vf != 0:
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3]
self.vf.write ( self.vf.write (
tmstr + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[ log_tmstr() + ";" + dnat[self.currentaddress] + ";" + command + ";" + result + ";" + negrsp[
result[4:6]] + "\n") result[4:6]] + "\n")
self.vf.flush () self.vf.flush ()
return "NR:" + result[4:6] + ':' + negrsp[result[4:6]] return "NR:" + result[4:6] + ':' + negrsp[result[4:6]]
@ -1867,8 +1857,7 @@ class ELM:
# save command to log # save command to log
if self.lf != 0: if self.lf != 0:
# tm = str(time.time()) # tm = str(time.time())
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3] self.lf.write (">[" + log_tmstr() + "]" + command + "\n")
self.lf.write (">[" + tmstr + "]" + command + "\n")
self.lf.flush () self.lf.flush ()
# send command # send command
@ -1890,8 +1879,7 @@ class ELM:
if command in self.buff: if command in self.buff:
break break
elif self.lf != 0: elif self.lf != 0:
tmstr = datetime.now ().strftime ("%H:%M:%S.%f")[:-3] self.lf.write ("<[" + log_tmstr() + "]" + self.buff + "(shifted)" + command + "\n")
self.lf.write ("<[" + tmstr + "]" + self.buff + "(shifted)" + command + "\n")
self.lf.flush () self.lf.flush ()
# count errors # count errors
@ -1961,7 +1949,6 @@ class ELM:
self.notSupportedCommands = {} self.notSupportedCommands = {}
if self.lf != 0: if self.lf != 0:
tmstr = datetime.now ().strftime ("%x %H:%M:%S.%f")[:-3]
self.lf.write('#' * 60 + "\n# Init CAN\n" + '#' * 60 + "\n") self.lf.write('#' * 60 + "\n# Init CAN\n" + '#' * 60 + "\n")
self.lf.flush() self.lf.flush()
@ -2105,8 +2092,7 @@ class ELM:
self.notSupportedCommands = {} self.notSupportedCommands = {}
if self.lf != 0: if self.lf != 0:
tmstr = datetime.now ().strftime ("%x %H:%M:%S.%f")[:-3] self.lf.write ('#' * 60 + "\n#[" + log_tmstr() + "] Init ISO\n" + '#' * 60 + "\n")
self.lf.write ('#' * 60 + "\n#[" + tmstr + "] Init ISO\n" + '#' * 60 + "\n")
self.lf.flush () self.lf.flush ()
self.check_answer (self.cmd ("at ws")) self.check_answer (self.cmd ("at ws"))
self.check_answer (self.cmd ("at e1")) self.check_answer (self.cmd ("at e1"))