Skip to content

Commit

Permalink
Merge pull request #55 from dmg210/main
Browse files Browse the repository at this point in the history
enable desired_baudrate for immo/clear adaptive values and bump gkbus version for fastinit fix
  • Loading branch information
dmg210 authored Nov 17, 2024
2 parents d418cdb + 747cc57 commit 17ffd36
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 40 deletions.
10 changes: 7 additions & 3 deletions flasher/ecu.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,13 @@ def read_memory_by_address (self, offset: int, size: int):
raise
return data

def clear_adaptive_values (self):
self.bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
self.bus.execute(kwp.commands.InputOutputControlByLocalIdentifier(IOIdentifier.ADAPTIVE_VALUES.value, kwp.enums.InputOutputControlParameter.RESET_TO_DEFAULT))
def clear_adaptive_values (self, desired_baudrate):
if desired_baudrate is None:
self.bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
self.bus.execute(kwp.commands.InputOutputControlByLocalIdentifier(IOIdentifier.ADAPTIVE_VALUES.value, kwp.enums.InputOutputControlParameter.RESET_TO_DEFAULT))
else:
self.bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate))
self.bus.execute(kwp.commands.InputOutputControlByLocalIdentifier(IOIdentifier.ADAPTIVE_VALUES.value, kwp.enums.InputOutputControlParameter.RESET_TO_DEFAULT))

class ECUIdentificationException (Exception):
pass
Expand Down
61 changes: 41 additions & 20 deletions flasher/immo.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@
6: 'Invalid key'
}

def cli_immo_info (bus):
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
def cli_immo_info (bus, desired_baudrate):
if desired_baudrate is None:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
else:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate))
try:
immo_data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.QUERY_IMMO_INFO.value)).get_data()
except (kwp.KWPNegativeResponseException):
Expand All @@ -35,10 +38,12 @@ def cli_immo_info (bus):
if (len(immo_data) > 4):
print('[*] Smartra status: {}'.format(immo_status[immo_data[4]]))

def cli_limp_home (bus):
def cli_limp_home (bus, desired_baudrate):
print('[*] starting default diagnostic session')
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))

if desired_baudrate is None:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
else:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate))
try:
data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_LIMP_HOME.value)).get_data()
except (kwp.KWPNegativeResponseException):
Expand Down Expand Up @@ -67,9 +72,12 @@ def cli_limp_home (bus):
if (data[1] == 1):
print('[*] limp home activated!')

def cli_immo_reset (bus):
def cli_immo_reset (bus, desired_baudrate):
print('[*] starting default diagnostic session')
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
if desired_baudrate is None:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
else:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate))

print('[*] starting routine 0x15')
data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_IMMO_RESET.value)).get_data()
Expand All @@ -94,9 +102,12 @@ def cli_immo_reset (bus):

print('[*] ECU reseted! Turn ignition off for 10 seconds for changes to take effect')

def cli_smartra_neutralize (bus):
def cli_smartra_neutralize (bus, desired_baudrate):
print('[*] starting default diagnostic session')
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
if desired_baudrate is None:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
else:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate))

print('[*] starting routine 0x25')
data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_SMARTRA_NEUTRALIZE.value)).get_data()
Expand All @@ -121,9 +132,12 @@ def cli_smartra_neutralize (bus):

print('[*] SMARTRA neutralized! Turn ignition off for 5 seconds for changes to take effect.')

def cli_immo_teach_keys (bus):
def cli_immo_teach_keys (bus, desired_baudrate):
print('[*] starting default diagnostic session')
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
if desired_baudrate is None:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
else:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate))

print('[*] starting routine 0x14')
data = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_IMMO_KEY_TEACHING.value)).get_data()
Expand All @@ -146,7 +160,7 @@ def cli_immo_teach_keys (bus):
break
print('[*] Done! Turn off ignition for 10 seconds for changes to take effect')

def cli_read_vin (bus):
def cli_read_vin (bus, desired_baudrate):
cmd = kwp.KWPCommand()
cmd.command = 0x09 # undocumented service
cmd.data = [0x02]
Expand All @@ -160,9 +174,13 @@ def cli_read_vin (bus):
print(' '.join([hex(x) for x in vin]))
print(''.join([chr(x) for x in vin]))

def cli_write_vin (bus):
def cli_write_vin (bus, desired_baudrate):
print('[*] starting flash reprogramming session')
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING))
if desired_baudrate is None:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING))
else:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING, desired_baudrate))

enable_security_access(bus)
vin = input('Enter VIN. WARNING! No validation!: ')

Expand All @@ -174,9 +192,12 @@ def cli_write_vin (bus):
return
print('[*] VIN changed! Turn ignition off for 5 seconds for changes to take effect.')

def cli_limp_home_teach (bus):
def cli_limp_home_teach (bus, desired_baudrate):
print('[*] starting default diagnostic session')
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
if desired_baudrate is None:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT))
else:
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.DEFAULT, desired_baudrate))

status = bus.execute(kwp.commands.StartRoutineByLocalIdentifier(Routine.BEFORE_LIMP_HOME_TEACHING.value)).get_data()[1]
print('[*] Current ECU status: {}'.format(immo_status[status]))
Expand Down Expand Up @@ -211,14 +232,14 @@ def cli_limp_home_teach (bus):
['Write VIN', cli_write_vin]
]

def cli_immo (bus):
def cli_immo (bus, desired_baudrate):
for key, menu in enumerate(immo_menus):
print(' [{}] {}'.format(key, menu[0]))
menu = input('Select immo menu: ')
try:
handler = immo_menus[int(menu)][1]
except (KeyError, IndexError, ValueError):
print('[!] Invalid choice! Try again')
return cli_immo(bus)
handler(bus)
bus.shutdown()
return cli_immo(bus, desired_baudrate)
handler(bus, desired_baudrate)
bus.shutdown()
18 changes: 10 additions & 8 deletions gkflasher.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ def cli_flash_eeprom (ecu, input_filename, flash_calibration=True, flash_program
ecu.bus.execute(kwp.commands.ECUReset(kwp.enums.ResetMode.POWER_ON_RESET)).get_data()
ecu.bus.shutdown()

def cli_clear_adaptive_values (ecu):
def cli_clear_adaptive_values (ecu, desired_baudrate):
print('[*] Clearing adaptive values.. ', end='')
ecu.clear_adaptive_values()
ecu.clear_adaptive_values(desired_baudrate)
print('Done!')

def load_config (config_filename):
Expand Down Expand Up @@ -196,12 +196,9 @@ def main(bus, args):

bus.init(kwp.commands.StartCommunication(), keepalive_payload=kwp.commands.TesterPresent(kwp.enums.ResponseType.REQUIRED), keepalive_timeout=1.5)

if (args.immo):
return cli_immo(bus)

if args.desired_baudrate:
try:
desired_baudrate = BAUDRATES[args.desired_baudrate]
desired_baudrate = args.desired_baudrate
except KeyError:
print('[!] Selected baudrate is invalid! Available baudrates:')
for key, baudrate in BAUDRATES.items():
Expand All @@ -214,8 +211,12 @@ def main(bus, args):
else:
print('[*] Trying to start diagnostic session')
bus.execute(kwp.commands.StartDiagnosticSession(kwp.enums.DiagnosticSession.FLASH_REPROGRAMMING))
desired_baudrate = None
bus.set_timeout(12)

if (args.immo):
return cli_immo(bus, desired_baudrate)

print('[*] Set timing parameters to maximum')
try:
available_timing = bus.execute(
Expand Down Expand Up @@ -258,8 +259,9 @@ def main(bus, args):
print(' [*] [{}] {}:'.format(hex(parameter_key), parameter['name']))
print(' [HEX]: {}'.format(value_hex))
print(' [ASCII]: {}'.format(value_ascii))
print('')

cli_immo_info(bus)
cli_immo_info(bus, desired_baudrate)

if (args.read):
cli_read_eeprom(ecu, eeprom_size, address_start=args.address_start, address_stop=args.address_stop, output_filename=args.output)
Expand All @@ -278,7 +280,7 @@ def main(bus, args):
cli_flash_eeprom(ecu, input_filename=args.flash_program, flash_program=True, flash_calibration=False)

if (args.clear_adaptive_values):
cli_clear_adaptive_values(ecu)
cli_clear_adaptive_values(ecu, desired_baudrate)

if (args.logger):
logger(ecu)
Expand Down
22 changes: 14 additions & 8 deletions gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,15 +204,16 @@ def initialize_ecu (self, log_callback):
if self.baudratesBox.currentData() == -1:
log_callback.emit('[*] Trying to start diagnostic session')
bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING))
self.desired_baudrate = None # No specific baud rate
else:
desired_baudrate = self.baudratesBox.currentData()
log_callback.emit('[*] Trying to start diagnostic session with baudrate {}'.format(BAUDRATES[desired_baudrate]))
self.desired_baudrate = self.baudratesBox.currentData()
log_callback.emit('[*] Trying to start diagnostic session with baudrate {}'.format(BAUDRATES[self.desired_baudrate]))
try:
bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, desired_baudrate))
bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, self.desired_baudrate))
except gkbus.GKBusTimeoutException:
bus.socket.socket.baudrate = BAUDRATES[desired_baudrate]
bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, desired_baudrate))
bus.socket.socket.baudrate = BAUDRATES[desired_baudrate]
bus.socket.socket.baudrate = BAUDRATES[self.desired_baudrate]
bus.execute(StartDiagnosticSession(DiagnosticSession.FLASH_REPROGRAMMING, self.desired_baudrate))
bus.socket.socket.baudrate = BAUDRATES[self.desired_baudrate]

bus.set_timeout(12)

Expand Down Expand Up @@ -420,8 +421,13 @@ def display_ecu_identification (self, progress_callback, log_callback):
log_callback.emit(' [*] [{}] {}:'.format(hex(parameter_key), parameter['name']))
log_callback.emit(' [HEX]: {}'.format(value_hex))
log_callback.emit(' [ASCII]: {}'.format(value_ascii))
log_callback.emit('')

ecu.bus.execute(StartDiagnosticSession(DiagnosticSession.DEFAULT))
if self.baudratesBox.currentData() == -1:
ecu.bus.execute(StartDiagnosticSession(DiagnosticSession.DEFAULT))
else:
desired_baudrate = self.baudratesBox.currentData()
ecu.bus.execute(StartDiagnosticSession(DiagnosticSession.DEFAULT, desired_baudrate))
try:
immo_data = ecu.bus.execute(StartRoutineByLocalIdentifier(Routine.QUERY_IMMO_INFO.value)).get_data()
except (KWPNegativeResponseException):
Expand Down Expand Up @@ -577,7 +583,7 @@ def clear_adaptive_values (self, progress_callback, log_callback):
return

log_callback.emit('[*] Clearing adaptive values.. ')
ecu.clear_adaptive_values()
ecu.clear_adaptive_values(self.desired_baudrate)
log_callback.emit('Done!')
self.disconnect_ecu(ecu)

Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
alive_progress==3.1.5
crcmod==1.7
gkbus==0.1.87
gkbus==0.2.7
pyqt5==5.15.10
PyYAML==6.0.1

0 comments on commit 17ffd36

Please sign in to comment.