Esempio n. 1
0
        private async void FlashDME_Data()
        {
            Checksums_Signatures ChecksumsSignatures = new Checksums_Signatures();
            {
                bool success = true;
                using (EdiabasNet ediabas = StartEdiabas())
                {
                    await Task.Run(() =>
                    {
                        if (!RequestSecurityAccess(ediabas))
                        {
                            success = false;
                            this.Dispatcher.Invoke(() =>
                            {
                                statusTextBlock.Text = "Security Access Denied";
                            });
                        }
                    });

                    uint eraseStart = 0x2040000;
                    uint eraseBlock = 0x20000;
                    uint flashStart = 0x2040000;
                    uint flashEnd   = 0x205CFFF;


                    if (Global.diagProtocol == "BMW-FAST")
                    {
                        if (!ExecuteJob(ediabas, "normaler_datenverkehr", "nein;nein;ja"))
                        {
                            return;
                        }
                        if (!ExecuteJob(ediabas, "normaler_datenverkehr", "ja;nein;nein"))
                        {
                            return;
                        }
                    }

                    this.Dispatcher.Invoke(() =>
                    {
                        statusTextBlock.Text = "Erasing Flash";
                    });
                    await Task.Run(() => success = EraseECU(ediabas, eraseBlock, eraseStart));

                    byte[] toFlash = null;

                    if (FullBin_CheckBox.IsChecked == true || Global.openedFlash.Length > 0x40000)
                    {
                        toFlash = Global.openedFlash.Skip(0x40000).Take(0x1D000).ToArray();
                    }
                    else
                    {
                        toFlash = Global.openedFlash.ToArray();
                    }

                    toFlash = ChecksumsSignatures.CorrectParameterChecksums(toFlash);
                    toFlash = ChecksumsSignatures.SignMS45Parameters(toFlash);



                    this.Dispatcher.Invoke(() =>
                    {
                        statusTextBlock.Text = "Flashing ECU";
                    });
                    await Task.Run(() => success = FlashBlock(ediabas, toFlash, flashStart, flashEnd));

                    if (success)
                    {
                        await Task.Run(() =>
                        {
                            if (Global.diagProtocol != "BMW-FAST")
                            {
                                if (!ExecuteJob(ediabas, "diagnose_mode", "DEFAULT;PC9600"))
                                {
                                    success = false;
                                    return;
                                }
                                if (!ExecuteJob(ediabas, "SET_PARAMETER", ";9600"))
                                {
                                    success = false;
                                    return;
                                }
                            }
                            else
                            {
                                if (!ExecuteJob(ediabas, "diagnose_mode", "DEFAULT"))
                                {
                                    success = false;
                                    return;
                                }

                                if (!ExecuteJob(ediabas, "normaler_datenverkehr", "ja;nein;ja"))
                                {
                                    success = false;
                                    return;
                                }
                            }

                            if (!ExecuteJob(ediabas, "FLASH_PROGRAMMIER_STATUS_LESEN", String.Empty))
                            {
                                success = false;
                                return;
                            }

                            this.Dispatcher.Invoke(() =>
                            {
                                statusTextBlock.Text = "Checking signature";
                            });
                            if (!ExecuteJob(ediabas, "FLASH_SIGNATUR_PRUEFEN", "Daten;64"))
                            {
                                this.Dispatcher.Invoke(() =>
                                {
                                    statusTextBlock.Text = "Signature check failed";
                                });
                                success = false;

                                if (!ExecuteJob(ediabas, "STEUERGERAETE_RESET", String.Empty))
                                {
                                    return;
                                }
                                return;
                            }
                            if (!ExecuteJob(ediabas, "FLASH_PROGRAMMIER_STATUS_LESEN", String.Empty))
                            {
                                success = false;
                                return;
                            }
                            this.Dispatcher.Invoke(() =>
                            {
                                statusTextBlock.Text = "Resetting ECU";
                            });
                            if (!ExecuteJob(ediabas, "STEUERGERAETE_RESET", String.Empty))
                            {
                                return;
                            }
                        });

                        if (success)
                        {
                            this.Dispatcher.Invoke(() =>
                            {
                                statusTextBlock.Text = "Flash successful";
                            });
                        }
                        else
                        {
                            this.Dispatcher.Invoke(() =>
                            {
                                statusTextBlock.Text = "Flash failed";
                            });
                        }
                    }
                    IdentDME();
                    return;
                }
            }
        }