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:
- Brīdināt fielderam, ja viņš iziet ārpus apstiprinātās cirsmas (kalcirte var notikt tikai apstiprinātā poligonā — VMD prasība)
- Auto-saglabāt GPS track kad lietotājs ir cirsmas iekšienē
- 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
SkiceStorageServicevai 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.