Tutkin diplomityössäni
älypuhelinten hyödyntämistä maatalouskäytössä. Tutkimukseen
liittyy GPS träkkäysohjelma, jota olen ollut kehittämässä jo
lähes vuoden. Ohjelman tarkoitus on automatisoida maatalouteen
liittyvän tyokirjanpidon muodostamista
Ohjelman on pystyttävä
seuraavaan maanviljelijän liikkeitä koko vuorokauden. Ohjelman
virrankulutus on pidettävä sellaisena, ettei se kuluta koko akkua
loppuun ainakaan kymmeneen tuntiin. GPS palvelu on siis pystyttävä
katkaisemaan väliajoin eikä muu puhelimen käyttö saa katkaista
träkkäystä.
Android-implementaatiossani
GPS kuuntelusta vastaa oma Androidin Service. Servicet sinänsä
eivät ole erityisen soveltuvia tähän käyttöön, koska ne ajetaan
samassa säikeessä muun ohjelman (käyttöliittymä) kanssa ja myös Servicen säie
lopetetaan, jos laite menee näppäinlukkoon tai on käyttämättä
jonkin aikaa. Ongelma ei poistu, vaikka Servicessä luotaisiin uusia
säikeitä.
Ratkaisuna käytin
WakeLockia, joka mahdollistaa näytön sammumisen ja näppäinlukon,
mutta ei pysäytä prosessoria ja säikeet pysyvät päällä.
Periaatteessa tämä on aika huono ominaisuus kännykkäohjelmalla,
mutta paras löytämäni tapa pitää träkkäys hengissä. Jos GPS
pollausintervalli pidetään yli minuutin mittaisena eli GPS on
vähintään minuutin pois päältä ja taas minuutin päällä,
virrankulutus pysyy melko inhimillisenä. Ohjelma lisää
virrankulutusta noin 15mA.
private void startListening() { new Thread(new Runnable() { @Override public void run() { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "AlkioGPS"); wl.acquire(); Looper.prepare(); while (!die) { mloc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, listener); try { Thread.sleep((gpsinterval / 2)); } catch (InterruptedException e) { e.printStackTrace(); } mloc.removeUpdates(listener); try { Thread.sleep(gpsinterval / 2); } catch (InterruptedException e) { e.printStackTrace(); } } gpstimer.cancel(); try { unregisterReceiver(rec); } catch (Exception e) { } wl.release(); } }).start(); }
Comments
Post a Comment