updates for splitting up assets and code etc
[swamp-bikeopera:code.git] / lib / gps.lua
1 -- Swamp Bike Opera embedded system for Kaffe Matthews 
2 -- Copyright (C) 2012 Wolfgang Hauptfleisch, Dave Griffiths
3 --
4 -- This program is free software: you can redistribute it and/or modify
5 -- it under the terms of the GNU General Public License as published by
6 -- the Free Software Foundation, either version 3 of the License, or
7 -- (at your option) any later version.
8 --
9 -- This program is distributed in the hope that it will be useful,
10 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
11 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 -- GNU General Public License for more details.
13 --
14 -- You should have received a copy of the GNU General Public License
15 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 module("gps", package.seeall)
18
19 require 'posix'
20 require 'socket'
21 require 'std'
22
23
24 ---
25 -- convert wgs data to location
26 function wgs_to_dec(lat, sign1, lon, sign2)
27     -- DEBUGGING ONLY: local ts = socket.gettime()
28
29     local d,m,r = string.match(lat, "(%d%d)(%d%d).(%d%d%d%d)")
30     local s = ( 60 / 10000 ) * r
31     local lat_deg = d + (m/60) + (s/3600)
32
33     local d,m,r = string.match(lon, "(%d%d)(%d%d).(%d%d%d%d)")
34     local s = ( 60 / 10000 ) * r
35     local lon_deg = d + (m/60) + (s/3600)
36
37     if sign2 == "W" then
38        lon_deg = lon_deg * - 1
39     end
40
41     -- DEBUGGING ONLY: local te = socket.gettime()
42
43     local file = io.open("/tmp/swamp_gps", "w")
44        file:write(std.round(lat_deg, 10).." "..std.round(lon_deg, 10))
45        print(std.round(lat_deg, 10) , std.round(lon_deg, 10))
46        -- gpslog(lat_deg, lon_deg)
47        file:close()
48
49 end
50
51
52 --- main loop
53 --@param device number
54 function loop(device)
55
56     for line in io.open("/dev/ttyACM"..device):lines() do
57       local no, lat, sign1, lon, sign2  = string.match(line, "GPGGA,(.-),(.-),(%w),(.-),(%w)")
58           if lat and sign1 then
59               wgs_to_dec(lat, sign1, lon, sign2)
60           end
61     end
62
63 return false
64 end
65
66 ---
67 --@return device number or false
68 function detect_device()
69     for i=0,20 do
70        if io.open("/dev/ttyACM"..i) then
71          return i 
72        end
73     end
74 return false
75 end
76
77
78 ---
79 function startup()
80     posix.mkfifo("/tmp/swamp_gps")
81  
82     while true do
83         local dev = detect_device()
84             if dev then
85                 print("found gps device "..dev) 
86                 loop(dev)
87             else
88                 print("no gps device found")
89                 os.execute("sleep 5")
90             end
91     end
92
93 end
94
95
96 function fake_zone()
97
98 local fakefile = io.open("/tmp/fake_gps", "r")
99 local fake_data = 0
100
101 if fakefile then
102    fake_data = tonumber(fakefile:read("*a")) or 0
103    fakefile:close()   
104 end
105
106 return fake_data
107
108 end