Hocam selamlar Aİ ile çalışmışsın galiba yada ben yanlış anladım mimari anlamda hatalar var gördüğüm alanları yazayım istedim amacım eleştiri yada işine karışmak değil


1. Yinelenen (çift tanımlı) tipler — en ciddi mimari hata


Aynı kavram birden çok kez, farklı namespace'lerde paralel olarak yazılmış ve eskisi silinmemiş:
  • AutoTuneEngine → hem Core/AutoTune/ (15 bağımlılıklı) hem Calibration/AutoTune/ (int[], int[] yapıcılı) sürümü var.
  • IAutoTuneEngine → hem Core/Interfaces/ hem Core/AutoTune/ altında iki ayrı arayüz.
  • Ayrıca çift tanımlı: EcuDatabaseManager, PatchAuditEntry, PatchPreview, TelemetryFrame.
Sonuç: ServiceContainer içinde IAutoTuneEngine iki kez, iki farklı motorla register ediliyor. İlk motorun tüm analyzer/telemetri yığını ölü ağırlık. Hangi implementasyonun çözümleneceği namespace using sırasına bağlı — kırılgan ve kafa karıştırıcı.


2. Bağımlılık enjeksiyonu / Service Locator karmaşası


Core/Container/ServiceContainer.cs kendi doküman yorumunda bile "DI Konteyneri (Service Locator)" diyerek iki kalıbı birbirine karıştırıyor. Sorunlar:
  • Her şey statik singleton. Static constructor içinde ~40 servis, gerçek donanım nesneleri dahil (RealObd1Connection, Tl866Programmer, Ch341aProgrammer, OstrichEmulator) uygulama açılışında koşulsuz örnekleniyor. Herhangi biri hata verirse tüm konteyner kalıcı olarak TypeInitializationException ile ölür.
  • Yaşam döngüsü/scope yok, mock enjeksiyonu ancak Reset() ile mümkün.
  • Konstruktör DI ile Service Locator karışık kullanılıyor. AutoTuneEngine 15 bağımlılığı yapıcıdan alırken, aynı sınıf metot içinde ServiceContainer.Resolve<IRomService>() çağırıyor (AutoTuneEngine.cs:472, 507). Gizli bağımlılık; 15 argümanlı yapıcının anlamı kalmıyor; test edilemez hale geliyor.
3. AI destekli AutoTune yazma yolundaki kritik hatalar


ApplyDecisionInternal (kalibrasyonu fiziksel ROM'a yazan asıl yol) birden çok ciddi hata içeriyor:
  • Yanlış/uydurma ROM offset'i. int resolvedOffset = 0x0278; // P28 fuel map default (satır 468). Gerçek P28 fuel map offset'i 0x1D40'tır (kendi P28Offsets.cs'lerine göre). 0x0278 tamamen yanlış bir adres; profil yüklenmemişse AutoTune buraya yazar → ROM'un rastgele bir bölgesi bozulur. "safe non-arbitrary fallback" yorumu da kendi içinde çelişkili (hardcode edilmiş tahmin zaten keyfîdir).
  • dummyDef ile 8×8 harita tanımı. Yazma işlemi Rows = 8, Columns = 8 olan bir MapDefinition ile yapılıyor (satır 483) — oysa haritalar 16×16. Yanlış satır uzunluğu (stride) → yanlış hücreye yazım. Değişkenin adı bile dummyDef.
  • Sahte checksum değerleri. 0.0, // Checksum placeholder, PreviousChecksum = 0.0, ExpectedChecksum = 1.0 (satır 438, 449-450). Rollback/recovery bütünlüğü bu sabit sahte değerlere dayandığı için işlevsiz. Ayrıca checksum double olarak modellenmiş (tamsayı/byte olması gerekirken).
  • Bozuk rollback. Geri yükleme new MapDefinition { MapName = ... } ile — offset/satır/sütun hiç set edilmemiş (satır 626). Yani geri yükleme offset 0 / varsayılan boyutlarla yazar; ROM'u onarmak yerine bozar.
4. Eşzamanlılık / thread-safety


Tüm oturum yaşam döngüsü metotları lock (_lockObj) kullanırken, asıl sıcak yol olan ProcessTelemetry kilit dışında çalışıyor. Bu metot ActiveSession'ı okuyup değiştiriyor, kuyruğa yazıyor ve ApplyDecisionInternal'ı çağırıyor. Telemetri arka planda geldiği için:
  • if (ActiveSession == null) return; kontrolünden sonra StopSession session'ı null'layabilir → TOCTOU / NullReference.
  • stableList.Count - 1 ile standart sapma hesabı: Count==1 olduğunda sıfıra bölme → NaN → confidence'a sızar (guard yok).
5. ROM offset modeli ve checksum yanlışları

  • Profil soyutlaması var ama baypas ediliyor. EcuProfile'da SpeedLimiterOffset, InjectorOffset gibi alanlar var; ancak yapıcı bunları her ECU için P28 değerlerine hardcode ediyor (0x1FAC, 0x1D80, 0x1FB6...). RomParser ise bu alanları bile kullanmayıp offset'leri doğrudan gövdeye gömüyor (0x1FAC, 0x1F42, 0x1D80, 0x1FB0...). Sonuç: bir P72 (B18C1) veya H22 ROM'unda "hız sınırı"/"launch control" yazınca yanlış byte'lar bozulur.
  • Harita içi offset çakışması (sayısal olarak doğruladım): InjectorDeadTime 0x1D80, fuel map'in (0x1D40–0x1E40) 64. hücresinin içinde; IdleOffset 0x1E80, ignition map'in (0x1E40–0x1F40) 64. hücresinin içinde. Yani enjektör ölü süresi/rölanti yazmak yakıt/ateşleme haritası hücresini ezer.
  • Anlamsız ölü kontroller: if (0x1FB0 < 0 || 0x1FB0 >= _rom.Length) gibi bir sabiti 0'la karşılaştıran, hiçbir zaman true olmayacak kontroller (LLM boilerplate).
  • Checksum kavramsal olarak yanlış. README ve P28Offsets.cs "checksum = tüm byte'ların XOR'u" diyor; profillerin varsayılanı ChecksumAlgorithm = "Xor8". Gerçek Honda OBD1 (P28) toplamsal (additive/sum) checksum kullanır — XOR ile üretilen ROM gerçek ECU'da reddedilir. Üstelik checksum üç ayrı yerde temsil ediliyor (ChecksumByte sabiti, ChecksumOffset, ChecksumAlgorithm string, ChecksumDefinitions listesi) ve RomParser içinde "yeni motor + legacy XOR fallback" ikilisi sessiz try/catch ile birbirine bağlanmış.
6. "AI/öğrenme" katmanının içi boş

  • FuelTrimAnalyzer "AI analizi" olarak sunuluyor ama tek satırlık oransal düzeltme yapıyor: proposedVE = currentVE * (1 + pct/100) — yani anlık AFR hatasının tamamını tek adımda (kazanç 1.0) uyguluyor. Adım sınırlaması, PID/integral, filtreleme yok → gerçek motorda salınım/aşım reçetesi.
  • Analyzer FuelVETable/VeTargets (VE tabanlı modern tune) modeli üzerine kurulu; oysa düzenlenen gerçek ROM D16Z6 P28'in enjektör-süresi tabanlı hız-yoğunluk haritası. Yani "AI tune" domain modeli ile asıl ROM paradigması uyuşmuyor.
  • ConfidenceScore = 85.0 sabit atanıyor, sonra motor bunu yeniden hesaplayıp eziyor → ölü kod.
  • AdaptiveMemory "öğrenme" gibi adlandırılmış ama aslında public mutable _entries alanına 1000'le sınırlı append yapan bir log; adaptif hiçbir mekanizma yok.

7. Hata yönetimi ve kod hijyeni

  • Sessiz yutulan catch {} blokları (en az 12 adet): checksum motorunu, profil çözümlemeyi, ROM üretimini vb. hatasız yutup yanlış legacy yola düşüyor.
  • Sahte/varsayılan okuma değerleri: offset geçersizken ReadSpeedLimiter→180, ReadVtecLoadThreshold→60, ReadLaunchControlRpm→3500 döndürerek kullanıcıya uydurma ama makul görünen veri gösteriyor (hatayı maskeliyor).
  • Testler production giriş noktasında. Program.Main, UI açılmadan önce TuningTestHarness.RunAllTests() + SampleRomTestFramework.RunAllTests() koşuyor.
  • Stringly-typed durum makinesi: "Reject", "Allow", "Approved", "Running" gibi string'ler enum yerine her yerde; yazım hatasına açık.
  • Yetki = string eşitliği: userId == "AdvancedUser" ? "Advanced" : ... — kimlik ile yetkilendirmeyi karıştıran, kolayca baypaslanabilir bir "güvenlik" modeli.
  • README .NET 6.0 diyor, .csproj net8.0-windows hedefliyor; README'deki HondaTuner/ alt-klasör yapısı gerçek dizin yapısıyla uyuşmuyor.