feat(sensors): Compass Foreground Demand Gating — talep-güdümlü pusula aboneliği#63
Merged
Merged
Conversation
…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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Amaç
gpsServicecompass (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 ekrandarot_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ı)
setDrivingView/setMapHeadingtakip kamerası + Rover marker yönü blend'lenmiş heading kullanır) → mount/unmount net sinyal.isDrivingdalında kullanır (mevcut histerezis: giriş >5 km/h, çıkış <3 km/h); park/dur dalında kuzey-yukarı statik → compass istemez._blendHeading→ storeheading.Model
document hidden→ mevcut Orientation Sensor Gate fiziksel listener'ı söker; foreground dönüşünde yalnız aktif tüketici varsa geri açar.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).stopGPSTrackingdemand 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 konumwatchPosition. 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
compassForegroundDemand.test.ts(yeni, 29 test): talep→compass yaşam döngüsü, ekran senaryoları (Ayarlar'da talep yok, mount/unmount, navigasyon), duplicate/idempotent/bounded/zero-leak, kapsam kilitleri (blackBox/smartDriving değişmedi, Generic Sensor API yok, sampling iddiası yok, PR fix(map): FullMapView boşta CPU runaway — yapılan-iş kapısı + render dedup #61/fix(gps): çift/üçlü konum aboneliğini tekilleştir (tek akış + fail-soft) #62/feat(kernel): Platform Kernel / Service Lifecycle Foundation #55 import yok).orientationDemandGating.test.ts(PR feat(sensors): always-on compass & smartDriving accel'i talep-güdümlü yap (PR 3/3) #58): compass'ın koşulsuz-acquire varsaydığı 1/3/5/6/7 kilitleri yeni talep-güdümlü davranışa GÜNCELLENDİ (silinmedi — regresyon-kasası yasası).tsc -btemiz, ESLint 0 error.Ledger
#43 🔴 "cihazda test edilmedi" — kabul ölçütü: Xiaomi
dumpsys sensorserviceönce/sonra (Ayarlar'darot_vec/game_rotveckapalı, 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 =
0x0brot_vec (absolute) +0x0fgame_rotvec (relative):0x0b+0x0fBAĞLANDI0x0b+0x0fSÖKÜLDÜ (23:07:19)0x0b/0x0fyok)0x0b+0x0fyeniden BAĞLANDI (23:09:56)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