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.