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