private ControllerInfo Kwp1281Wakeup(bool evenParityWakeup = false) { Logger.WriteLine("Sending wakeup message"); var kwpVersion = _kwpCommon.WakeUp((byte)_controllerAddress, evenParityWakeup); if (kwpVersion != 1281) { throw new InvalidOperationException("Expected KWP1281 protocol."); } _kwp1281 = new KW1281Dialog(_kwpCommon); var ecuInfo = _kwp1281.ReadEcuInfo(); Logger.WriteLine($"ECU: {ecuInfo}"); return(ecuInfo); }
private bool UnlockCluster(IKW1281Dialog kwp1281) { var versionBlocks = kwp1281.CustomReadSoftwareVersion(); // Now we need to send an unlock code that is unique to each ROM version Logger.WriteLine("Sending Custom \"Unlock partial EEPROM read\" block"); var softwareVersion = versionBlocks[0].Body; var unlockCodes = GetClusterUnlockCodes(softwareVersion); var unlocked = false; foreach (var unlockCode in unlockCodes) { var unlockCommand = new List <byte> { 0x9D }; unlockCommand.AddRange(unlockCode); var unlockResponse = kwp1281.SendCustom(unlockCommand); if (unlockResponse.Count != 1) { throw new InvalidOperationException( $"Received multiple responses from unlock request."); } if (unlockResponse[0].IsAck) { Logger.WriteLine( $"Unlock code for software version {KW1281Dialog.DumpMixedContent(softwareVersion)} is {Utils.Dump(unlockCode)}"); if (unlockCodes.Length > 1) { Logger.WriteLine("Please report this to the program maintainer."); } unlocked = true; break; } else if (!unlockResponse[0].IsNak) { throw new InvalidOperationException( $"Received non-ACK/NAK ${unlockResponse[0].Title:X2} from unlock request."); } } return(unlocked); }