Skip to content

feat(sensors): Compass Foreground Demand Gating — talep-güdümlü pusula aboneliği#63

Merged
selimmujdeci merged 1 commit into
mainfrom
feat/compass-foreground-demand-gating
Jul 11, 2026
Merged

feat(sensors): Compass Foreground Demand Gating — talep-güdümlü pusula aboneliği#63
selimmujdeci merged 1 commit into
mainfrom
feat/compass-foreground-demand-gating

Conversation

@selimmujdeci

@selimmujdeci selimmujdeci commented Jul 11, 2026

Copy link
Copy Markdown
Owner

Amaç

gpsService compass (cihaz yönü) orientation aboneliklerini yalnız gerçekten heading/pusula kullanan bir harita/navigasyon tüketicisi aktifken açmak. PR #42'nin (Ledger #42) bilinçli bıraktığı "Compass Settings ekranında KAPATILMADI" sınırlamasını kapatır.

Sorun (saha)

_startCompassListener() startGPSTracking() ile koşulsuz açılıyor ve uygulama ön plandayken (Ayarlar / profil / medya / haritasız ekran dahil) hiç kapanmıyordu → cihaz QA'sında (Xiaomi) boşta ana ekranda rot_vec (absolute) + game_rotvec (relative) sensörleri 60 Hz açık ölçüldü. Orientation Sensor Gate arka planda söküyordu ama ön plan talebini bilmiyordu.

Analiz — güvenilir tüketici sinyali (yeni store uydurulmadı)

  • FullMapView = heading-up harita ekranı (setDrivingView/setMapHeading takip kamerası + Rover marker yönü blend'lenmiş heading kullanır) → mount/unmount net sinyal.
  • MiniMapWidget = heading'i yalnız kendi isDriving dalında kullanır (mevcut histerezis: giriş >5 km/h, çıkış <3 km/h); park/dur dalında kuzey-yukarı statik → compass istemez.
  • Navigasyon aktifliği zaten full map mount ile örtüşüyor.
  • Compass çıktısı tek yere gidiyor: _blendHeading → store heading.

Model

  • Harita/navigasyon heading tüketicisi acquire eder → ilk acquire'da gate compass aboneliği açılır.
  • Son release → orientation abonelikleri kapanır.
  • Ayarlar / profil / medya / haritasız ekranlarda compass kapalı.
  • Mini harita yalnız kuzey-yukarı statikteyse compass istemez; heading-up (sürüş) olunca ister.
  • document hidden → mevcut Orientation Sensor Gate fiziksel listener'ı söker; foreground dönüşünde yalnız aktif tüketici varsa geri açar.
  • Talep yokken GPS konum takibi aynen sürer — yalnız compass kapanır.

API — compassDemand.ts (yeni, ref-count'lu owner sözleşmesi)

acquireCompassDemand(owner) · releaseCompassDemand(owner) · hasCompassDemand() · getCompassDemandCount() · subscribeCompassDemand() (yalnız 0↔1 geçişlerinde bildirir).

  • owner bazlı duplicate acquire yok · release idempotent · owner bounded (32) · import yan etkisiz · timer/polling yok · gpsService gate'in sahibi değildir (yalnız abone) · zero-leak (stopGPSTracking demand unsub'ı bırakır; MiniMap unmount cleanup release eder).

Değişmeyen (bilinçli korunan)

blend/smoothing (computeBlendedHeading/applyCompassSmoothing/COMPASS_THROTTLE_MS), izin + fallback yolu, background/foreground gate davranışı, GPS konum watchPosition. Native samplingPeriod düşüşü İDDİA EDİLMEZ (Chromium DeviceOrientation 60 Hz sabit); Generic Sensor API eklenmez.

Kapsam kilitleri (dokunulmadı)

blackBoxService · smartDrivingEngine · FullMapView idle-render PR #61 · GPS duplicate PR #62 · Platform Kernel PR #55 · SystemBoot · OBD/CAN · SQL/Supabase.

Testler

Ledger

#43 🔴 "cihazda test edilmedi" — kabul ölçütü: Xiaomi dumpsys sensorservice önce/sonra (Ayarlar'da rot_vec/game_rotvec kapalı, harita açılınca geri), heading doğruluğu, harita kapanınca söküm, background bozulmaması, duplicate listener yok, idle CPU + SensorsHandlerThread ölçümü, Mali-400 doğrulaması. Test edilmeden 🟢 yapma.

🟢 Gerçek Cihaz Doğrulaması (2026-07-11, Xiaomi zircon)

Cihaz: Xiaomi 23090RA98I (zircon) · Android 13 / SDK 33 · GPU Mali-G610 MC4 · APPUID 10290.
Build: birleşik cihaz-testi build'i (main + #61 + #62 + #63); bu PR'ın compass kodu (compassDemand.ts, gpsService.ts, FullMapView.tsx, MiniMapWidget.tsx) build'de birebir yer alıyor (temiz auto-merge, çakışmasız). Kanıt: dumpsys sensorservice +/- kayıt log'u.

Compass sensörleri = 0x0b rot_vec (absolute) + 0x0f game_rotvec (relative):

Senaryo Gözlem Sonuç
Tam ekran harita açık 0x0b+0x0f BAĞLANDI
Harita kapatıldı (X KAPAT) 0x0b+0x0f SÖKÜLDÜ (23:07:19)
Ana ekran (park) compass kapalı (motion sensörleri #58 kapsamı, ayrı)
Ayarlar ekranı compass kapalı (0x0b/0x0f yok)
Background (HOME +30s) 5 sensörün tamamı söküldü
Haritaya dönüş 0x0b+0x0f yeniden BAĞLANDI (23:09:56)
Kararlılık 30 dk soak: crash/ANR yok, PSS/Native Heap leak yok, PID kesintisiz

Kapsam-dışı / eksik: fiziksel-döndürme heading doğruluğu (cihaz uzaktan döndürülemez → ⏸️); Mali-400 (K24) ayrı doğrulama bekler. Ham kanıt: docs-local/device-runs/20260711T230001-unified-183488b/.

➡️ Bu PR'ın kabul ölçütlerinin sensör/kararlılık kısmı gerçek cihazda karşılandı; talep-güdümlü compass aç/kapa/yeniden-aç döngüsü doğrulandı.

🤖 Generated with Claude Code

…a aboneliği

ÖNCE: gpsService._startCompassListener() startGPSTracking() ile KOŞULSUZ açılıyor,
uygulama ön plandayken (Ayarlar/profil/medya/haritasız ekran dahil) HİÇ kapanmıyordu
→ cihaz QA'sında boşta ana ekranda rot_vec + game_rotvec 60 Hz açık ölçüldü
(Ledger #42'de bilinen sınırlama: "Compass Settings'te KAPATILMADI").

ŞİMDİ: küçük, ref-count'lu, owner-bazlı compass demand contract:
 - compassDemand.ts (yeni): acquire/release/has/getCount + subscribe (0↔1 geçişleri).
   Owner bounded(32), duplicate acquire yok, release idempotent, timer/polling yok,
   import yan etkisiz, zero-leak.
 - gpsService: compass artık talep-güdümlü — ilk acquire → gate aboneliği AÇILIR,
   son release → KAPANIR (yalnız GPS tracking açıkken). Konum takibi ETKİLENMEZ.
 - FullMapView: mount'ta 'map:full' acquire / unmount'ta release (heading-up harita).
 - MiniMapWidget: YALNIZ kendi mevcut isDriving histerezisinde (giriş >5, çıkış <3 km/h)
   'map:mini' acquire — park/kuzey-yukarı statikte talep YOK (yeni eşik eklenmedi).

KORUNAN: blend/smoothing (computeBlendedHeading/applyCompassSmoothing/COMPASS_THROTTLE_MS),
izin + fallback yolu, background/foreground gate (visibility) davranışı, GPS konum watch.
Native samplingPeriod düşüşü İDDİA EDİLMEZ (Chromium 60 Hz sabit); Generic Sensor API yok.

Kapsam-dışı dokunulmadı: blackBox, smartDriving, FullMapView PR #61, GPS PR #62,
Platform Kernel PR #55, SystemBoot, OBD/CAN, SQL.

Testler: compassForegroundDemand.test.ts (yeni, 29 test). PR #58 kilit dosyası
orientationDemandGating.test.ts'in 1/3/5/6/7 kilitleri (compass koşulsuz-acquire
varsayan) yeni talep-güdümlü davranışa GÜNCELLENDİ (silinmedi). Tam suite 3229 yeşil,
tsc temiz, eslint 0 error.

Ledger: #43 🔴 "cihazda test edilmedi" — kabul ölçütü Xiaomi dumpsys sensorservice
önce/sonra + idle CPU/SensorsHandlerThread + Mali-400.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014VxojH1dYGXbiAxzETXm6r
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
car-launcher-pro Ready Ready Preview, Comment Jul 11, 2026 7:14pm
carospro Ready Ready Preview, Comment Jul 11, 2026 7:14pm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant