Controllare la nostra posizione GPS

In questo esempio vediamo come estrarre la posizione GPS attuale del telefono e controllare che effettivamente il nostro operatore sia dove dovrebbe essere. In pratica durante il salvataggio del suo rapportino di lavoro vedremo se effettivamente si trova nelle vicinanze del cliente.


Gruppo Script

Scheda

Evento

Post Salvataggio


-- calcolo della distanza tra 2 punti

function get_distance(A,B)

local latA = (A["lat"] * math.pi) / 180

local lonA = (A["lon"] * math.pi) / 180

local latB = (B["lat"] * math.pi) / 180

local lonB = (B["lon"] * math.pi) / 180

local R = 6372.795477598

local dist = (R * math.acos(math.sin(latA) *

math.sin(latB) + math.cos(latA) * math.cos(latB) * math.cos(lonA-lonB)))*1000

return dist

end

-- controlla se la posizione passata è nel cantiere

function in_cantiere(coordA, coordB, raggio)

if (get_distance(coordA, coordB)<=raggio) then

return true

end

return false

end

Per prima cosa creiamo due funzioni che verranno richiamate dallo script per misurare le distanze tra il punto GPS attuale e, in questo caso, i punti GPS dei cantieri.

local cantieri = database.getsql("SELECT * FROM coordinate_cantieri WHERE latitudine<>0 AND longitudine<>0 AND latitudine IS NOT NULL AND longitudine IS NOT NULL")


local righe_cantieri = cantieri.getrows()


-- recupera le coordinate GPS

local coord = program.geolocation()

local curr_lat = 0

local curr_lon = 0


curr_lat = coord[1]

curr_lon = coord[2]

Leggiamo tutti i cantieri presenti nel database prendendo solo quelli con una coordinata GPS valida. Nios4 non considera i valori di latitudine e longitudine se tutti e due sono a zero.

Successivamente interroghiamo il telefono per recuperare la posizione.

--coordinate non trovate

if (curr_lat==0 and curr_lon==0) then

errorn.errorcode = "ERR-FL"

errorn.errormessage = "Impossibile recuperare le coordinate GPS, riprovare in un secondo momento"

dataview.setvalue(nomecampo,"Da controllare

(GPS non trovato)")

do return end

end

Nel caso in cui non si riuscisse a recuperare il punto GPS, allora si potrà dare errore e uscire dallo script. Questo è il sistema più drastico.

Il metodo migliore sarebbe dare un messaggio e permettere comunque il salvataggio, magari impostando un valore di un campo a dati non confermati. Questo per evitare che un operatore non possa salvare i dati se il GPS non funziona.

for i, c in pairs(righe_cantieri) do

-- coordinate del cantiere

local lat = c.getvalue("latitudine")

local lon = c.getvalue("longitudine")

local cantiere_coord = {lat = lat, lon = lon}


if (in_cantiere(current_coord, cantiere_coord, c.getvalue("raggio"))==true) then

dataview.setvalue("stato","GPS

trovato")

set_cantiere_rapportino(c.getvalue("gguidp"))

do return end

end

end

dataview.setvalue("stato","Da controllare (GPS non trovato)")

Iniziamo a girare tutti i cantieri e, attraverso le funzioni create all’inizio, controlliamo se la distanza tra la nostra posizione attuale e quella dei cantieri è minore del raggio dato. In caso positivo siamo effettivamente nel cantiere, altrimenti si imposterà il ruolo del campo in modo da segnalare che i valori non sono stati confermati dalla posizione GPS.