Pāriet uz saturu

Geofencing

Geofencing ir reālā laika point-in-polygon pārbaude — vai lietotāja GPS atrašanās vieta ir cirsmas vai skices iekšienē, ārpusē, vai uz robežas. CA Navigator to lieto:

  1. Brīdināt fielderam, ja viņš iziet ārpus apstiprinātās cirsmas (kalcirte var notikt tikai apstiprinātā poligonā — VMD prasība)
  2. Auto-saglabāt GPS track kad lietotājs ir cirsmas iekšienē
  3. Aktivēt audio brīdinājumus kad ir tuvu malai

Servisa atbildība

lib/services/geofence_service.dart:

  • Tick interval: 2 sekundes (kompromiss starp baterijas patēriņu un reaktivitāti)
  • Lasīt aktīvo poligonu no SkiceStorageService vai aktīvās CA
  • Pārbaude: pointInPolygon(currentLocation, polygon.coordinates) — Ray casting algoritms

Koordinātu transformācija

GPS dod WGS84 (grādu, lat/lon). CA polygons no VMD nāk LKS-92 (metru, X/Y).

Konvertē vienreiz pie polygon ielādes ar proj4dart: - lib/utils/projections.dart - LKS-92 → WGS84 transformācija, lai pēc tam point-in-polygon strādā tieši uz WGS84 koordinātēm

// pseudokods
final polygonWgs84 = wktLks92.points
    .map((p) => projections.lks92ToWgs84(p))
    .toList();

Brīdinājumu loģika

Atkarīga no cirtes veida (sk. Cirtes veidi):

Cirtes veids Tālums no malas Brīdinājuma līmenis
Kailcirte / Atmežošana <5 m no malas Vibrācija + skaņa + bnota
Kailcirte iziets ārpus Pastāvīga vibrācija + sarkans warning
Kopšanas iziets ārpus Klusais brīdinājums
Izlases / Sanitārā iziets ārpus Klusais brīdinājums

Default fallback: ja cirtes veids nav zināms → uztur kailcirtes stingrību.

Field režīms

FieldModeService (sk. Mobile arhitektūra) ieslēdz "sun-readable" UI ar:

  • Augstu kontrastu
  • Lielāki klikšķu apgabali
  • Vienkāršot skaņas — vibrācija prioritāre par teksta brīdinājumiem
  • Wakelock — ekrāns neaizmig

Background tracking

BackgroundGpsService izmanto flutter_foreground_task — Android foreground service:

  • Aktivējās tikai pēc lietotāja iestatījuma "Stay alive" toggle
  • Notifikāciju ikona statusa joslā, kamēr aktīvs (Android prasība)
  • Turpina GPS stream'u arī kad app aizmiga vai ekrāns nodzisis
  • Geofence tick'i turpinās

Bez šī, kad lietotājs aizvēršs ekrānu, GPS apstājas un brīdinājumi nedarbojas.

Slodzes raksturojums

Ar 2s tick + Kalman smoother (200ms latence GPS samples) + 200-virsotnes polygon (tipiska cirsma):

  • CPU: < 1% uz Samsung G970F (Android 12)
  • Baterija: ~3-5% / stunda papildu virs GPS bāzes
  • Tīkls: nulle (visi dati lokāli)

Testēšana

# Unit testi
flutter test test/services/geofence_service_test.dart

# Manuālā testēšana
# 1. Atver app, dodies uz CA cirsmu
# 2. Sāc tracking ar "Stay alive" ON
# 3. Aizver ekrānu, ej ārpus poligona
# 4. Saņem vibrāciju + skaņas brīdinājumu 2 sek laikā

Detalizēti testi: TESTING.md.