Esempio LUA: 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

Inseriamo le due funzioni che verranno utilizzate dallo script per il calcolo delle distanze e il controllo se il punto gps è effettivamente all’interno della circonferenza richiesta

 -- 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.