Merge branch 'pyren3' of https://gitlab.com/py_ren/pyren into pyren3
This commit is contained in:
commit
a203c0558d
70
main.py
70
main.py
@ -6,7 +6,7 @@
|
||||
##################################
|
||||
# #
|
||||
# #
|
||||
# Version: 3.0 (1-Aug-2022) #
|
||||
# Version: 3.1 (2-Jan-2023) #
|
||||
# Author: Shr-Lnm #
|
||||
# #
|
||||
# #
|
||||
@ -16,7 +16,7 @@ __author__ = "Shr-Lnm"
|
||||
__copyright__ = "Copyright 2018-2022"
|
||||
__credits__ = []
|
||||
# __license__ = "GNU" # Unknown licence!
|
||||
__version__ = "3.0.0" # python3 maybe ?
|
||||
__version__ = "3.1.0" # python3 maybe ?
|
||||
__maintainer__ = "Shr-Lnm"
|
||||
__email__ = "mshkn@inbox.ru"
|
||||
__status__ = "Beta"
|
||||
@ -26,6 +26,7 @@ import shutil
|
||||
from os import listdir
|
||||
from os.path import isdir
|
||||
from os.path import isfile
|
||||
import re
|
||||
import sys
|
||||
|
||||
try:
|
||||
@ -244,9 +245,17 @@ def run(s, cmd):
|
||||
cmdr = __import__('mod_ddt')
|
||||
elif cmd == 'term':
|
||||
cmdr = __import__('mod_term')
|
||||
elif cmd == 'pids':
|
||||
cmdr = __import__('mod_ecu')
|
||||
|
||||
if s.port.upper() == 'BT' or s.port == '':
|
||||
s.port = 'bt'
|
||||
|
||||
if s.port.upper().endswith(';BT'):
|
||||
s.port = s.port.split(';')[0]
|
||||
|
||||
if s.port.lower() == 'bt' or s.port == '': s.port = 'bt'
|
||||
sys.argv.append('-p' + s.port)
|
||||
|
||||
if cmd == 'demo':
|
||||
sys.argv.append('--demo')
|
||||
if cmd == 'scan' and cmd != 'term':
|
||||
@ -903,6 +912,11 @@ else:
|
||||
self.droid.fullDismiss()
|
||||
run(self.save, 'term')
|
||||
|
||||
def cmd_PIDs(self):
|
||||
self.saveSettings()
|
||||
self.droid.fullDismiss()
|
||||
run(self.save, 'pids')
|
||||
|
||||
def cmd_Update(self):
|
||||
res = update_from_gitlab()
|
||||
if res == 0:
|
||||
@ -918,9 +932,17 @@ else:
|
||||
self.save.csvOption = self.csvl[int(self.droid.fullQueryDetail("sp_csv").result['selectedItemPosition'])]
|
||||
|
||||
if self.droid.fullQueryDetail("rb_bt").result['checked'] == 'false':
|
||||
self.save.port = self.droid.fullQueryDetail("in_wifi").result['text']
|
||||
self.save.port = '192.168.0.10:3500'
|
||||
else:
|
||||
self.save.port = 'BT'
|
||||
portName = self.dev_list[int(self.droid.fullQueryDetail("in_wifi").result['selectedItemPosition'])]
|
||||
upPortName = portName.upper().split(';')[0]
|
||||
MAC = ''
|
||||
if re.match (r"^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$", upPortName) or \
|
||||
re.match (r"^[0-9A-F]{4}.[0-9A-F]{4}.[0-9A-F]{4}$", upPortName) or \
|
||||
re.match (r"^[0-9A-F]{12}$", upPortName):
|
||||
upPortName = upPortName.replace(':','').replace('.','')
|
||||
MAC = ':'.join (a + b for a, b in zip (upPortName[::2], upPortName[1::2]))
|
||||
self.save.port = MAC + ';' + 'BT'
|
||||
|
||||
self.save.speed = '38400'
|
||||
|
||||
@ -983,15 +1005,23 @@ else:
|
||||
self.csvl = csvl
|
||||
|
||||
if self.save.port == '':
|
||||
self.save.port = "192.168.0.10:35000"
|
||||
if self.save.port.lower() == 'bt':
|
||||
self.save.port = "192.168.0.10:35000;WiFi"
|
||||
self.dev_list.append(self.save.port)
|
||||
if self.save.port.upper().endswith('BT'):
|
||||
MAC = ""
|
||||
if ';' in self.save.port:
|
||||
MAC = self.save.port.split(';')[0]
|
||||
for d in self.dev_list:
|
||||
if MAC in d:
|
||||
self.dev_list.insert(0, self.dev_list.pop(self.dev_list.index(d)))
|
||||
|
||||
self.droid.fullSetProperty("rb_bt", "checked", "true")
|
||||
self.droid.fullSetProperty("rb_wifi", "checked", "false")
|
||||
self.droid.fullSetProperty("in_wifi", "text", "192.168.0.10:35000")
|
||||
self.droid.fullSetList("in_wifi", self.dev_list)
|
||||
else:
|
||||
self.droid.fullSetProperty("rb_bt", "checked", "false")
|
||||
self.droid.fullSetProperty("rb_wifi", "checked", "true")
|
||||
self.droid.fullSetProperty("in_wifi", "text", self.save.port)
|
||||
self.droid.fullSetList("in_wifi", self.dev_list)
|
||||
|
||||
self.droid.fullSetProperty("in_logname", "text", self.save.logName)
|
||||
if self.save.log:
|
||||
@ -1096,16 +1126,14 @@ else:
|
||||
android:checked="false"
|
||||
android:text="WiFi" />
|
||||
</RadioGroup>
|
||||
<EditText
|
||||
<Spinner
|
||||
android:id="@+id/in_wifi"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_below="@id/tx_elm"
|
||||
android:layout_toRightOf="@id/radioGroup"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:ems="10"
|
||||
android:text="192.168.0.10:35000" />
|
||||
android:layout_marginLeft="20dp" />
|
||||
<TextView
|
||||
android:id="@+id/tx_log"
|
||||
android:layout_width="wrap_content"
|
||||
@ -1256,6 +1284,13 @@ else:
|
||||
android:layout_below="@id/bt_start"
|
||||
android:layout_toLeftOf="@+id/bt_mon"
|
||||
android:text="Macro" />
|
||||
<Button
|
||||
android:id="@+id/bt_pids"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/bt_start"
|
||||
android:layout_toLeftOf="@+id/bt_term"
|
||||
android:text="PIDs" />
|
||||
<Button
|
||||
android:id="@+id/bt_update"
|
||||
android:layout_width="wrap_content"
|
||||
@ -1287,6 +1322,8 @@ else:
|
||||
self.cmd_Mon()
|
||||
elif id == "bt_term":
|
||||
self.cmd_Term()
|
||||
elif id == "bt_pids":
|
||||
self.cmd_PIDs()
|
||||
elif id == "bt_update":
|
||||
self.cmd_Update()
|
||||
|
||||
@ -1295,6 +1332,13 @@ else:
|
||||
try:
|
||||
self.droid = android.Android()
|
||||
self.droid.fullShow(self.lay)
|
||||
self.dev_list = ['192.168.0.10:35000;WiFi']
|
||||
try:
|
||||
tmp = self.droid.bluetoothGetBondedDevices().result
|
||||
for i in range(0, len(tmp), 2):
|
||||
self.dev_list.append( tmp[i]+';'+tmp[i+1])
|
||||
except:
|
||||
pass
|
||||
self.loadSettings()
|
||||
self.eventloop()
|
||||
finally:
|
||||
|
@ -107,6 +107,8 @@ def acf_MTC_generateDefaults( m, mtc ):
|
||||
if ddtxml.upper().endswith('.XML'):
|
||||
ddtxml = ddtxml[:-4]
|
||||
|
||||
ddtxml = ddtxml.replace('\\', '_')
|
||||
|
||||
if m['ecuname']=='':
|
||||
m['ecuname'] = m['dst']
|
||||
|
||||
|
@ -237,7 +237,7 @@ class DDTECU():
|
||||
|
||||
''' 0 1 2 3 4 5 6 7 '''
|
||||
''' 01234567890123456789012345678901234567890123456789012345678901234567890123456'''
|
||||
#IdRsp = '61 80 34 36 33 32 52 45 34 42 45 30 30 33 37 52 00 83 9D 00 1A 90 01 01 00 88 AA'
|
||||
#IdRsp = '61 80 82 00 41 86 46 04 41 46 4A 82 00 41 86 46 D1 00 30 00 00 48 00 05 09 05'
|
||||
''' -- -------- ----- ----- '''
|
||||
''' DiagVersion--+ | | +--Version '''
|
||||
''' Supplier--+ +--Soft '''
|
||||
@ -297,6 +297,8 @@ class DDTECU():
|
||||
fname = mod_globals.opt_ddtxml
|
||||
self.ecufname = mod_globals.ddtroot+'/ecus/'+fname
|
||||
else:
|
||||
#vehTypeCode = 'x81'
|
||||
#Address = '0D'
|
||||
problist = ecuSearch(vehTypeCode, Address, DiagVersion, Supplier, Soft, Version, eculist)
|
||||
|
||||
while 1:
|
||||
@ -1130,6 +1132,52 @@ def minDist(a, b):
|
||||
|
||||
return d
|
||||
|
||||
def distance( a, b ):
|
||||
""" calculate distance between strings """
|
||||
""" normalized to length of string """
|
||||
""" a - readen value """
|
||||
""" b - pattern from eculist """
|
||||
|
||||
d = 0
|
||||
|
||||
# align length
|
||||
if len( a ) < len( b ):
|
||||
a = a + ' ' * ( len( b ) - len( a ))
|
||||
else:
|
||||
b = b + ' ' * ( len( a ) - len( b ))
|
||||
|
||||
# humming distance
|
||||
l = len(a)
|
||||
for i in range(0, l):
|
||||
if b[i] != '?' and ord(a[i]) != ord(b[i]):
|
||||
d = d + 1
|
||||
|
||||
# normalize to length of string
|
||||
if d:
|
||||
d = d / l
|
||||
|
||||
return d
|
||||
|
||||
def AutoIdents_distance( DiagVersion, Supplier, Soft, Version, ai ):
|
||||
|
||||
#normalize supplier in such cases
|
||||
#DiagVersion="12" Supplier="746" Soft="2470" Version="A600"
|
||||
#DiagVersion="12" Supplier="39324d" Soft="0052" Version="0400"
|
||||
try:
|
||||
if len( ai['Supplier'] ) == 6 and \
|
||||
len( ai['Soft'] ) == 4 and \
|
||||
len( ai['Version'] ) == 4:
|
||||
ai['Supplier'] = bytes.fromhex(ai['Supplier']).decode('utf-8')
|
||||
except:
|
||||
#catch not hex supplier with len 6
|
||||
pass
|
||||
|
||||
d = distance( DiagVersion, ai['DiagVersion']) * 0.25
|
||||
d = d + distance( Supplier, ai['Supplier']) * 0.25
|
||||
d = d + distance( Soft, ai['Soft']) * 0.25
|
||||
d = d + distance( Version, ai['Version']) * 0.25
|
||||
|
||||
return round( d, 4 )
|
||||
|
||||
def ecuSearch(vehTypeCode, Address, DiagVersion, Supplier, Soft, Version, el, interactive = True):
|
||||
|
||||
@ -1148,13 +1196,14 @@ def ecuSearch(vehTypeCode, Address, DiagVersion, Supplier, Soft, Version, el, in
|
||||
|
||||
for k in list(t.keys()):
|
||||
for ai in t[k]['AutoIdents']:
|
||||
dist = 0
|
||||
dist = dist + minDist(DiagVersion, ai['DiagVersion']) * 1000 # weight
|
||||
dist = dist + minDist(Supplier, ai['Supplier']) * 1 # weight
|
||||
dist = dist + minDist(Soft, ai['Soft']) * 1 # weight
|
||||
dist = dist + minDist(Version, ai['Version']) * 1 # weight
|
||||
#dist = 0
|
||||
#dist = dist + minDist(DiagVersion, ai['DiagVersion']) * 1000 # weight
|
||||
#dist = dist + minDist(Supplier, ai['Supplier']) * 1 # weight
|
||||
#dist = dist + minDist(Soft, ai['Soft']) * 1 # weight
|
||||
#dist = dist + minDist(Version, ai['Version']) * 1 # weight
|
||||
dist = AutoIdents_distance( DiagVersion, Supplier, Soft, Version, ai )
|
||||
|
||||
if vehTypeCode in t[k]['Projects'] or dist == 0:
|
||||
if vehTypeCode.upper() in t[k]['Projects'] or dist == 0:
|
||||
if k not in list(cand.keys()): cand[k] = 0xFFFFFFFF
|
||||
if dist < cand[k]: cand[k] = dist
|
||||
if dist < min: min = dist
|
||||
|
@ -1275,6 +1275,7 @@ def main():
|
||||
ecuid = input('Enetr ECU ID:')
|
||||
lanid = input('Language [RU]:')
|
||||
if len(lanid)<2: lanid = 'RU'
|
||||
sys.argv = sys.argv[:1]
|
||||
sys.argv.append(ecuid)
|
||||
sys.argv.append(lanid)
|
||||
sys.argv.append('TORQ')
|
||||
@ -1386,8 +1387,11 @@ def main():
|
||||
ddd = '82'+F2A[family]+'F1'
|
||||
filename = "PR_"+F2A[family]+"_"+eindex+"_"+sys.argv[2]+".csv"
|
||||
|
||||
if mod_globals.os=='android' and os.path.exists('/sdcard/.torque/extendedpids'):
|
||||
filename = '/sdcard/.torque/extendedpids/'+filename
|
||||
ext_path = '/storage/emulated/0/.torque/extendedpids/'
|
||||
if mod_globals.os=='android':
|
||||
if not os.path.exists(ext_path):
|
||||
os.makedirs( ext_path, exist_ok=True )
|
||||
filename = ext_path+filename
|
||||
|
||||
cf = open( filename, "w")
|
||||
|
||||
@ -1496,8 +1500,11 @@ def main():
|
||||
|
||||
# make profile for torque
|
||||
profilename = str(int(time.time()))+'.tdv'
|
||||
if mod_globals.os=='android' and os.path.exists('/sdcard/.torque/vehicles'):
|
||||
profilename = '/sdcard/.torque/vehicles/'+str(int(time.time()))+'.tdv'
|
||||
veh_path = '/storage/emulated/0/.torque/vehicles/'
|
||||
if mod_globals.os=='android':
|
||||
if not os.path.exists(veh_path):
|
||||
os.makedirs( veh_path, exist_ok=True )
|
||||
profilename = veh_path+str(int(time.time()))+'.tdv'
|
||||
|
||||
prn = open( profilename, "w")
|
||||
prn.write( '#This is an ECU profile generated by pyren\n' )
|
||||
|
@ -158,9 +158,17 @@ class Port:
|
||||
|
||||
self.portTimeout = portTimeout
|
||||
|
||||
portName = portName.strip ()
|
||||
portName = portName.strip()
|
||||
|
||||
if re.match (r"^[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}$", portName):
|
||||
MAC = None
|
||||
upPortName = portName.upper()
|
||||
if re.match (r"^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$", upPortName) or \
|
||||
re.match (r"^[0-9A-F]{4}.[0-9A-F]{4}.[0-9A-F]{4}$", upPortName) or \
|
||||
re.match (r"^[0-9A-F]{12}$", upPortName):
|
||||
upPortName = upPortName.replace(':','').replace('.','')
|
||||
MAC = ':'.join (a + b for a, b in zip (upPortName[::2], upPortName[1::2]))
|
||||
|
||||
if mod_globals.os != 'android' and MAC:
|
||||
try:
|
||||
self.macaddr = portName
|
||||
self.channel = 1
|
||||
@ -187,16 +195,22 @@ class Port:
|
||||
print(" \n\nERROR: Can't connect to WiFi ELM\n\n")
|
||||
mod_globals.opt_demo = True
|
||||
sys.exit()
|
||||
elif mod_globals.os == 'android' and portName == 'bt':
|
||||
elif mod_globals.os == 'android' and ( portName == 'bt' or MAC != None ):
|
||||
self.portType = 2
|
||||
self.droid = android.Android ()
|
||||
self.droid.toggleBluetoothState (True)
|
||||
if self.droid:
|
||||
print('SL4A loaded')
|
||||
print( 'BT is enabled:', self.droid.toggleBluetoothState (True).result)
|
||||
print( 'BT discovery canceled:', self.droid.bluetoothDiscoveryCancel().result)
|
||||
retry = 0
|
||||
while 1:
|
||||
time.sleep(1)
|
||||
retry = retry + 1
|
||||
try:
|
||||
self.btcid = self.droid.bluetoothConnect ('00001101-0000-1000-8000-00805F9B34FB').result
|
||||
if MAC == None:
|
||||
self.btcid = self.droid.bluetoothConnect ('00001101-0000-1000-8000-00805F9B34FB').result
|
||||
else:
|
||||
self.btcid = self.droid.bluetoothConnect (uuid='00001101-0000-1000-8000-00805F9B34FB', address=MAC).result
|
||||
except:
|
||||
pass
|
||||
print( 'Try ',retry, ":", self.btcid )
|
||||
@ -1327,6 +1341,8 @@ class ELM:
|
||||
self.l1_cache[command] = str(hex(nframes))[2:].upper()
|
||||
|
||||
if len (result) // 2 >= nbytes and noerrors:
|
||||
# trim padding
|
||||
result = result[:nbytes*2]
|
||||
# split by bytes and return
|
||||
result = ' '.join (a + b for a, b in zip (result[::2], result[1::2]))
|
||||
return result
|
||||
@ -1540,11 +1556,13 @@ class ELM:
|
||||
|
||||
if responses[0][:1] == '0': # single frame (sf)
|
||||
nBytes = int(responses[0][1:2], 16)
|
||||
rspLen = nBytes
|
||||
nFrames = 1
|
||||
result = responses[0][2:2 + nBytes * 2]
|
||||
|
||||
elif responses[0][:1] == '1': # first frame (ff)
|
||||
nBytes = int(responses[0][1:4], 16)
|
||||
rspLen = nBytes
|
||||
nBytes = nBytes - 6 # we assume that it should be more then 7
|
||||
nFrames = 1 + nBytes // 7 + bool(nBytes % 7)
|
||||
cFrame = 1
|
||||
@ -1592,6 +1610,8 @@ class ELM:
|
||||
self.l1_cache[init_command] = str(nFrames)
|
||||
|
||||
if noerrors and len(result) // 2 >= nBytes:
|
||||
# trim padding
|
||||
result = result[:rspLen*2]
|
||||
# split by bytes and return
|
||||
result = ' '.join(a + b for a, b in zip(result[::2], result[1::2]))
|
||||
return result
|
||||
@ -1758,11 +1778,13 @@ class ELM:
|
||||
|
||||
if responses[0][:1] == '0': # single frame (sf)
|
||||
nBytes = int (responses[0][1:2], 16)
|
||||
rspLen = nBytes
|
||||
nFrames = 1
|
||||
result = responses[0][2:2 + nBytes * 2]
|
||||
|
||||
elif responses[0][:1] == '1': # first frame (ff)
|
||||
nBytes = int (responses[0][1:4], 16)
|
||||
rspLen = nBytes
|
||||
nBytes = nBytes - 6 # we assume that it should be more then 7
|
||||
nFrames = 1 + nBytes//7 + bool(nBytes%7)
|
||||
cFrame = 1
|
||||
@ -1811,6 +1833,8 @@ class ELM:
|
||||
noErrors = False
|
||||
|
||||
if len (result) // 2 >= nBytes and noErrors and result[:2] != '7F':
|
||||
# trim padding
|
||||
result = result[:rspLen*2]
|
||||
# split by bytes and return
|
||||
result = ' '.join (a + b for a, b in zip (result[::2], result[1::2]))
|
||||
return result
|
||||
|
Loading…
x
Reference in New Issue
Block a user