Check our GPS position

In this example we see how to extract the phone's current GPS position and check that our operator is actually where it should be. In practice, while saving his work report, we will see if he is actually in the customer's proximity.

Script GroupEvent
FormPost saving
  -- 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
-- check if the past position is on the construction site
function in_dockyard(coordA, coordB, radius)
        if (get_distance(coordA, coordB)<=radius) then
               return true
        return false

First we create two functions that will be called by the script to measure the distance between the current GPS point and, in this case, the GPS points of the dockyards.

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

local rows_dockyard = dockyard.getrows()

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

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

We read all the cantieri in the database by taking only those with a valid GPS coordinate. Nios4 does not consider the latitude and longitude values if both are zero.

We then interrogate the phone to retrieve the position.

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

If the GPS point cannot be recovered, then you can give an error and exit the script. This is the most drastic system.

The best method would be to give a message and still allow saving, perhaps by setting a value of a field to unconfirmed data. This is to prevent an operator from being able to save data if GPS is not working.

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

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

We start to turn all the dockyards and, through the functions created at the beginning, we check if the distance between our current position and that of the dockyard is less than the gived radius. If so, we are actually on the dockyard, otherwise the role of the filed wll be set in order to signal that the values have not been confirmed by the GPS position.