Controlarea pozitiei GPS

In acest exemplu, vedem cum sa extragem pozitia GPS actuala a telefonului si sa verificam daca operatorul nostru este efectiv unde ar trebui sa fie. In practica, in timpul salvarii raportului sau de activitate, vom vedea daca acesta se afla efectiv in apropierea clientului.

Grup ScriptEveniment
FisaSalvare ulterioara
  -- calculation of the distance between 2 points
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
-- check if the past position is on the construction site
function in_constructionsite(coordA, coordB, radius)
        if (get_distance(coordA, coordB)<=radius) then
               return true
        end
        return false
end

Mai intai, cream doua functiuni care vor fi apelate de catre script pentru a masura distantele dintre punctul GPS actual si, in acest caz, punctele GPS ale santierelor/punctelor de lucru.

local constructionsite database.getsql("SELECT  * FROM coord_constructionsite WHERE latitude<>0 AND longitude<>0 AND latitude IS NOT NULL AND longitude IS NOT NULL")

local rows_constructionsite = constructionsite.getrows()

 -- retrieve GPS coordinates
local coord = program.geolocation()
local curr_lat = 0
local curr_lon = 0

curr_lat = coord[1]
curr_lon = coord[2]

Citim toate punctele de lucru prezente in baza de date luandu-le doar pe acelea cu o coordonata GPS valida. Nios4 nu ia in considerare valorile latitudinii si longitudinii daca ambele sunt la zero.

Interogam apoi telefonul pentru a recupera pozitia.

--coordinates not found
if (curr_lat==0 and curr_lon==0) then
        errorn.errorcode    = "ERR-FL"
        errorn.errormessage = "Unable to recover GPS coordinates, try again in a second moment"
        dataview.setvalue(fieldname,"To check
        (GPS not found)")
        do return end
end

Daca punctul GPS nu poate fi recuperat, atunci puteti da eroare si iesi din script. Acesta este cel mai drastic sistem.

Cea mai buna metoda ar fi sa dati un mesaj si sa permiteti totusi salvarea, prin setarea unei valori a unui camp la Date neconfirmate, acest lucru pentru a permite operatorului sa poata salva datele daca GPS-ul nu functioneaza. dati non confermati. Questo per evitare che un operatore non possa salvare i dati se il GPS non funziona.

for i, c in pairs(rows_constructionsite) do
        -- construction site coordinates
        local lat = c.getvalue("latitude")
        local lon = c.getvalue("longitude")
        local constructionsite_coord = {lat = lat, lon = lon}

        if (in_constructionsite(current_coord, constructionsite_coord, c.getvalue("radius"))==true) then
               dataview.setvalue("state","GPS
               found")
               set_constructionsite_report(c.getvalue("gguidp"))
               do return end
        end
end
dataview.setvalue("state","To check (GPS not found)")

Incepem sa intoarcem toate santierele si, prin functiunile create la inceput, verificam daca distanta dintre pozitia noastra actuala si cea a santierelor este mai mica decat raza data. Daca da, suntem de fapt pe santier, in caz contrar, rolul campului va fi stabilit astfel incat sa semnaleze faptul ca valorile nu au fost confirmate de pozitia GPS.