示例#1
0
        private async void Flashfull()
        {
            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 = 0x2060000;
                uint eraseBlock = 0xA0000;
                uint flashStart = 0x2060000;
                uint flashEnd   = 0x20FFF3F;

                uint flashMPCStart = 0;
                uint flashMPCEnd   = 0x6FFFF;

                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;

                toFlash = ChecksumsSignatures.CorrectProgramChecksums(Global.openedFlash, Global.openedMPC);
                toFlash = ChecksumsSignatures.SignMS45Program(toFlash, Global.openedMPC).Skip(0x60000).Take(0x9FF40).ToArray();



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


                toFlash = null;
                toFlash = Global.openedMPC;

                this.Dispatcher.Invoke(() =>
                {
                    statusTextBlock.Text = "Flashing Internal Program";
                });

                await Task.Run(() => success = FlashBlock(ediabas, toFlash, flashMPCStart, flashMPCEnd));

                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, "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", "Programm;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;
            }
        }