sgslib 0.4.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +24 -17
- data/README.md +43 -7
- data/Rakefile +2 -2
- data/bin/console +34 -1
- data/exe/sgs_alarm +41 -0
- data/exe/sgs_diag +41 -0
- data/exe/sgs_gpsread +42 -0
- data/exe/sgs_logger +45 -0
- data/exe/sgs_mission +45 -0
- data/exe/sgs_nav +43 -0
- data/exe/sgs_otto +46 -0
- data/exe/sgs_report +44 -0
- data/lib/sgs/alarm.rb +74 -32
- data/lib/sgs/bearing.rb +151 -0
- data/lib/sgs/config.rb +35 -24
- data/lib/sgs/course.rb +29 -24
- data/lib/sgs/diagnostics.rb +50 -0
- data/lib/sgs/gps.rb +50 -21
- data/lib/sgs/location.rb +58 -159
- data/lib/sgs/logger.rb +30 -84
- data/lib/sgs/mission.rb +97 -173
- data/lib/sgs/mission_status.rb +127 -0
- data/lib/sgs/navigate.rb +56 -21
- data/lib/sgs/nmea.rb +32 -22
- data/lib/sgs/otto.rb +207 -22
- data/lib/sgs/redis_base.rb +32 -24
- data/lib/sgs/report.rb +54 -0
- data/lib/sgs/rpc.rb +29 -21
- data/lib/sgs/timing.rb +32 -24
- data/lib/sgs/version.rb +35 -1
- data/lib/sgs/waypoint.rb +69 -33
- data/lib/sgslib.rb +34 -21
- data/sgslib.gemspec +16 -6
- metadata +91 -21
- data/.gitignore +0 -9
- data/.rspec +0 -2
- data/.travis.yml +0 -4
- data/CODE_OF_CONDUCT.md +0 -49
- data/bin/setup +0 -8
data/lib/sgs/alarm.rb
CHANGED
@@ -1,36 +1,42 @@
|
|
1
1
|
#
|
2
|
-
# Copyright (c) 2013, Kalopa
|
3
|
-
#
|
4
|
-
# GNU General Public License as published by the Free Software Foundation;
|
5
|
-
# either version 2, or (at your option) any later version.
|
2
|
+
# Copyright (c) 2013-2023, Kalopa Robotics Limited. All rights
|
3
|
+
# reserved.
|
6
4
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
5
|
+
# This program is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU General Public License as
|
7
|
+
# published by the Free Software Foundation; either version 2 of
|
8
|
+
# the License, or (at your option) any later version.
|
11
9
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
15
14
|
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
18
|
+
# 02110-1301, USA.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY KALOPA ROBOTICS LIMITED "AS IS" AND
|
21
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22
|
+
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
23
|
+
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALOPA
|
24
|
+
# ROBOTICS LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
27
|
+
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
29
|
+
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
30
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
31
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
32
|
+
#
|
33
|
+
# ABSTRACT
|
26
34
|
#
|
27
35
|
|
28
36
|
##
|
29
37
|
# Routines for handling sailboat alarms. Note that this is the definitive
|
30
38
|
# list of alarms on the system. To add or modify an alarm, do so here.
|
31
39
|
#
|
32
|
-
require 'date'
|
33
|
-
|
34
40
|
module SGS
|
35
41
|
##
|
36
42
|
# Deal with alarm subsystem.
|
@@ -38,7 +44,9 @@ module SGS
|
|
38
44
|
class Alarm < RedisBase
|
39
45
|
attr_accessor :last_report, :time
|
40
46
|
|
41
|
-
|
47
|
+
#
|
48
|
+
# Alarms generated by Otto.
|
49
|
+
MISSION_SWITCH = 0
|
42
50
|
RUDDSRV_FAULT = 1
|
43
51
|
SAILSRV_FAULT = 2
|
44
52
|
VBATT_CRITICAL = 3
|
@@ -54,16 +62,18 @@ module SGS
|
|
54
62
|
RUDDER_NOZERO = 13
|
55
63
|
SAIL_NOZERO = 14
|
56
64
|
MOTHER_UNRESP = 15
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
#
|
66
|
+
# Alarms generated by Mother.
|
67
|
+
OTTO_RESTART = 16
|
68
|
+
MISSION_COMMENCE = 17
|
69
|
+
MISSION_COMPLETE = 18
|
70
|
+
MISSION_ABORT = 19
|
71
|
+
WAYPOINT_REACHED = 20
|
72
|
+
CROSS_TRACK_ERROR = 21
|
73
|
+
INSIDE_FENCE = 22
|
64
74
|
|
65
75
|
ALARM_NAMES = [
|
66
|
-
"
|
76
|
+
"Mission Activation Switch",
|
67
77
|
"Rudder Servo Fault",
|
68
78
|
"Sail Servo Fault",
|
69
79
|
"Battery voltage is critically low",
|
@@ -79,6 +89,7 @@ module SGS
|
|
79
89
|
"Cannot zero the rudder position",
|
80
90
|
"Cannot zero the sail position",
|
81
91
|
"Mother is unresponsive",
|
92
|
+
"OTTO Restarted",
|
82
93
|
"Mission has commenced",
|
83
94
|
"Mission is completed",
|
84
95
|
"*** MISSION ABORT ***",
|
@@ -94,6 +105,37 @@ module SGS
|
|
94
105
|
super
|
95
106
|
end
|
96
107
|
|
108
|
+
#
|
109
|
+
# Main daemon function (called from executable)
|
110
|
+
def self.daemon
|
111
|
+
puts "Alarm daemon starting up..."
|
112
|
+
otto = SGS::RPCClient.new(:otto)
|
113
|
+
loop do
|
114
|
+
#puts "Check for any alarms..."
|
115
|
+
#resp = otto.command "A?"
|
116
|
+
#puts "Response: #{resp}"
|
117
|
+
sleep 30
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
#
|
122
|
+
# Build a C include file based on the current alarm definitions
|
123
|
+
def self.build_include(fname)
|
124
|
+
alarm = new
|
125
|
+
File.open(fname, "w") do |f|
|
126
|
+
f.puts "/*\n * Autogenerated by #{__FILE__}.\n * DO NOT HAND-EDIT!\n */"
|
127
|
+
constants.sort.each do |c|
|
128
|
+
unless c == :ALARM_NAMES
|
129
|
+
cval = SGS::Alarm.const_get(c)
|
130
|
+
str = "#define SGS_ALARM_#{c.to_s}"
|
131
|
+
str += "\t" if str.length < 32
|
132
|
+
str += "\t#{cval}\t/* #{alarm.name(cval)} */"
|
133
|
+
f.puts str
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
97
139
|
#
|
98
140
|
# Convert an alarm number into a string.
|
99
141
|
def name(alarmno)
|
data/lib/sgs/bearing.rb
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# Copyright (c) 2013-2023, Kalopa Robotics Limited. All rights
|
4
|
+
# reserved.
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License as
|
8
|
+
# published by the Free Software Foundation; either version 2 of
|
9
|
+
# the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19
|
+
# 02110-1301, USA.
|
20
|
+
#
|
21
|
+
# THIS SOFTWARE IS PROVIDED BY KALOPA ROBOTICS LIMITED "AS IS" AND
|
22
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
23
|
+
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
24
|
+
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALOPA
|
25
|
+
# ROBOTICS LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
26
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
27
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
28
|
+
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
29
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
30
|
+
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
31
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
32
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
33
|
+
#
|
34
|
+
# ABSTRACT
|
35
|
+
#
|
36
|
+
|
37
|
+
##
|
38
|
+
# Routines for handling sailboat bearings.
|
39
|
+
#
|
40
|
+
require 'json'
|
41
|
+
|
42
|
+
module SGS
|
43
|
+
##
|
44
|
+
# Class for dealing with the angle/distance vector.
|
45
|
+
#
|
46
|
+
# Note that for convenience, we retain the angle in Radians. The
|
47
|
+
# distance is in nautical miles.
|
48
|
+
class Bearing
|
49
|
+
attr_accessor :distance
|
50
|
+
|
51
|
+
#
|
52
|
+
# Create the Bearing instance.
|
53
|
+
def initialize(angle = 0.0, distance = 0.0)
|
54
|
+
self.angle = angle.to_f
|
55
|
+
self.distance = distance.to_f
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Create a bearing from an angle in degrees.
|
60
|
+
def self.degrees(angle, distance)
|
61
|
+
new(Bearing.dtor(angle), distance)
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Handy function to translate degrees to radians
|
66
|
+
def self.dtor(deg)
|
67
|
+
deg.to_f * Math::PI / 180.0
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Handy function to translate radians to degrees
|
72
|
+
def self.rtod(rad)
|
73
|
+
rad.to_f * 180.0 / Math::PI
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Handy function to re-adjust an angle away from negative
|
78
|
+
def self.absolute(angle)
|
79
|
+
(angle + 2.0 * Math::PI) % (2.0 * Math::PI)
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Another handy function to re-adjust an angle (in degrees) away from
|
84
|
+
# negative.
|
85
|
+
def self.absolute_d(angle)
|
86
|
+
(angle + 360) % 360
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Haversine formula for calculating distance and angle, given two
|
91
|
+
# locations.
|
92
|
+
#
|
93
|
+
# To calculate an angle and distance from two positions:
|
94
|
+
#
|
95
|
+
# This code was derived from formulae on the Movable Type site:
|
96
|
+
# http://www.movable-type.co.uk/scripts/latlong.html
|
97
|
+
#
|
98
|
+
# var d = Math.acos(Math.sin(lat1)*Math.sin(lat2) +
|
99
|
+
# Math.cos(lat1)*Math.cos(lat2) *
|
100
|
+
# Math.cos(lon2-lon1)) * R;
|
101
|
+
# var y = Math.sin(dLon) * Math.cos(lat2);
|
102
|
+
# var x = Math.cos(lat1)*Math.sin(lat2) -
|
103
|
+
# Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
|
104
|
+
# var angle = Math.atan2(y, x).toDeg();
|
105
|
+
def self.compute(loc1, loc2)
|
106
|
+
bearing = new
|
107
|
+
sin_lat1 = Math.sin(loc1.latitude)
|
108
|
+
sin_lat2 = Math.sin(loc2.latitude)
|
109
|
+
cos_lat1 = Math.cos(loc1.latitude)
|
110
|
+
cos_lat2 = Math.cos(loc2.latitude)
|
111
|
+
sin_dlon = Math.sin(loc2.longitude - loc1.longitude)
|
112
|
+
cos_dlon = Math.cos(loc2.longitude - loc1.longitude)
|
113
|
+
bearing.distance = Math.acos(sin_lat1*sin_lat2 + cos_lat1*cos_lat2*cos_dlon) *
|
114
|
+
SGS::EARTH_RADIUS
|
115
|
+
y = sin_dlon * cos_lat2
|
116
|
+
x = cos_lat1 * sin_lat2 - sin_lat1 * cos_lat2 * cos_dlon
|
117
|
+
bearing.angle = Math.atan2(y, x)
|
118
|
+
bearing
|
119
|
+
end
|
120
|
+
|
121
|
+
#
|
122
|
+
# Set the angle
|
123
|
+
def angle=(angle)
|
124
|
+
@angle = Bearing.absolute(angle)
|
125
|
+
end
|
126
|
+
|
127
|
+
#
|
128
|
+
# Get the angle
|
129
|
+
def angle
|
130
|
+
@angle
|
131
|
+
end
|
132
|
+
|
133
|
+
#
|
134
|
+
# Return the angle (in degrees)
|
135
|
+
def angle_d
|
136
|
+
Bearing.rtod(@angle).to_i
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# Get the back-angle (the angle viewed from the opposite end of the line)
|
141
|
+
def back_angle
|
142
|
+
Bearing.absolute(@angle - Math::PI)
|
143
|
+
end
|
144
|
+
|
145
|
+
#
|
146
|
+
# Convert to a string
|
147
|
+
def to_s
|
148
|
+
"BRNG %03dd,%.3fnm" % [angle_d, @distance]
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
data/lib/sgs/config.rb
CHANGED
@@ -1,38 +1,48 @@
|
|
1
1
|
#
|
2
|
-
# Copyright (c) 2018, Kalopa
|
3
|
-
#
|
4
|
-
# GNU General Public License as published by the Free Software Foundation;
|
5
|
-
# either version 2, or (at your option) any later version.
|
2
|
+
# Copyright (c) 2018-2023, Kalopa Robotics Limited. All rights
|
3
|
+
# reserved.
|
6
4
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
5
|
+
# This program is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU General Public License as
|
7
|
+
# published by the Free Software Foundation; either version 2 of
|
8
|
+
# the License, or (at your option) any later version.
|
11
9
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
15
14
|
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
18
|
+
# 02110-1301, USA.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY KALOPA ROBOTICS LIMITED "AS IS" AND
|
21
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22
|
+
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
23
|
+
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALOPA
|
24
|
+
# ROBOTICS LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
27
|
+
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
29
|
+
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
30
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
31
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
32
|
+
#
|
33
|
+
# ABSTRACT
|
26
34
|
#
|
27
35
|
module SGS
|
28
36
|
class Config < RedisBase
|
29
37
|
attr_accessor :otto_device, :gps_device, :comm_device
|
30
38
|
attr_accessor :otto_speed, :gps_speed, :comm_speed
|
39
|
+
attr_accessor :mission_file
|
31
40
|
|
32
41
|
def initialize
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@
|
42
|
+
@mission_file = "/etc/mission.yaml"
|
43
|
+
@otto_device = "/dev/ttyu0"
|
44
|
+
@gps_device = "/dev/ttyu1"
|
45
|
+
@comm_device = "/dev/ttyu2"
|
36
46
|
@otto_speed = @gps_speed = @comm_speed = 9600
|
37
47
|
super()
|
38
48
|
end
|
@@ -41,6 +51,7 @@ module SGS
|
|
41
51
|
# Set up the Redis configuration with some basic data
|
42
52
|
def self.configure_all
|
43
53
|
Config.setup
|
54
|
+
MissionStatus.setup
|
44
55
|
Alarm.setup
|
45
56
|
GPS.setup
|
46
57
|
Otto.setup
|
data/lib/sgs/course.rb
CHANGED
@@ -1,28 +1,36 @@
|
|
1
1
|
#
|
2
|
-
# Copyright (c) 2013, Kalopa
|
3
|
-
#
|
4
|
-
# GNU General Public License as published by the Free Software Foundation;
|
5
|
-
# either version 2, or (at your option) any later version.
|
2
|
+
# Copyright (c) 2013-2023, Kalopa Robotics Limited. All rights
|
3
|
+
# reserved.
|
6
4
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
5
|
+
# This program is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU General Public License as
|
7
|
+
# published by the Free Software Foundation; either version 2 of
|
8
|
+
# the License, or (at your option) any later version.
|
11
9
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
15
14
|
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
18
|
+
# 02110-1301, USA.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY KALOPA ROBOTICS LIMITED "AS IS" AND
|
21
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22
|
+
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
23
|
+
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALOPA
|
24
|
+
# ROBOTICS LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
27
|
+
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
29
|
+
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
30
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
31
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
32
|
+
#
|
33
|
+
# ABSTRACT
|
26
34
|
#
|
27
35
|
|
28
36
|
##
|
@@ -31,9 +39,6 @@
|
|
31
39
|
# The code on this page was derived from formulae on the Movable Type site:
|
32
40
|
# http://www.movable-type.co.uk/scripts/latlong.html
|
33
41
|
#
|
34
|
-
|
35
|
-
require 'date'
|
36
|
-
|
37
42
|
module SGS
|
38
43
|
##
|
39
44
|
#
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2013-2023, Kalopa Robotics Limited. All rights
|
3
|
+
# reserved.
|
4
|
+
#
|
5
|
+
# This program is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU General Public License as
|
7
|
+
# published by the Free Software Foundation; either version 2 of
|
8
|
+
# the License, or (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
18
|
+
# 02110-1301, USA.
|
19
|
+
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY KALOPA ROBOTICS LIMITED "AS IS" AND
|
21
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22
|
+
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
23
|
+
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALOPA
|
24
|
+
# ROBOTICS LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
27
|
+
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
29
|
+
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
30
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
31
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
32
|
+
#
|
33
|
+
# ABSTRACT
|
34
|
+
#
|
35
|
+
|
36
|
+
##
|
37
|
+
# Routines for handling sailboat navigation and route planning.
|
38
|
+
#
|
39
|
+
module SGS
|
40
|
+
class Diagnostics < RedisBase
|
41
|
+
#
|
42
|
+
# Main daemon function (called from executable)
|
43
|
+
def self.daemon
|
44
|
+
puts "Diagnostics subsystem starting up..."
|
45
|
+
loop do
|
46
|
+
sleep 300
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/sgs/gps.rb
CHANGED
@@ -1,29 +1,39 @@
|
|
1
1
|
#
|
2
|
-
# Copyright (c) 2013, Kalopa
|
3
|
-
#
|
4
|
-
# GNU General Public License as published by the Free Software Foundation;
|
5
|
-
# either version 2, or (at your option) any later version.
|
2
|
+
# Copyright (c) 2013-2023, Kalopa Robotics Limited. All rights
|
3
|
+
# reserved.
|
6
4
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
5
|
+
# This program is free software; you can redistribute it and/or
|
6
|
+
# modify it under the terms of the GNU General Public License as
|
7
|
+
# published by the Free Software Foundation; either version 2 of
|
8
|
+
# the License, or (at your option) any later version.
|
11
9
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
15
14
|
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
21
|
-
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
22
|
-
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
23
|
-
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
-
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
-
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
18
|
+
# 02110-1301, USA.
|
26
19
|
#
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY KALOPA ROBOTICS LIMITED "AS IS" AND
|
21
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22
|
+
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
23
|
+
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KALOPA
|
24
|
+
# ROBOTICS LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
27
|
+
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
29
|
+
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
30
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
31
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
32
|
+
#
|
33
|
+
# ABSTRACT
|
34
|
+
#
|
35
|
+
require 'serialport'
|
36
|
+
|
27
37
|
module SGS
|
28
38
|
class GPS < RedisBase
|
29
39
|
attr_accessor :time, :location, :sog, :cmg, :magvar
|
@@ -38,6 +48,25 @@ module SGS
|
|
38
48
|
super()
|
39
49
|
end
|
40
50
|
|
51
|
+
#
|
52
|
+
# Main daemon function (called from executable)
|
53
|
+
def self.daemon
|
54
|
+
puts "GPS reader starting up..."
|
55
|
+
config = SGS::Config.load
|
56
|
+
|
57
|
+
sp = SerialPort.new config.gps_device, config.gps_speed
|
58
|
+
sp.read_timeout = 10000
|
59
|
+
|
60
|
+
loop do
|
61
|
+
nmea = SGS::NMEA.parse sp.readline
|
62
|
+
if nmea.is_gprmc?
|
63
|
+
gps = nmea.parse_gprmc
|
64
|
+
p gps
|
65
|
+
gps.save_and_publish if gps and gps.valid?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
41
70
|
#
|
42
71
|
# Set the validity
|
43
72
|
def is_valid
|