sgslib 0.2.5 → 0.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2d1545ff97c12353a0d6865f2ec76260fb46f9b4
4
- data.tar.gz: 969ed61e80c23eeed6cc4a3a26e9ab926de99cde
3
+ metadata.gz: c7ee0414fad3641eb50bf386b9e05b2b4290ac3d
4
+ data.tar.gz: aec3efc5d970a7705bc44b90f26e060dd286650a
5
5
  SHA512:
6
- metadata.gz: dac58e7cfb3f74db9627c38b9086a7eaad7878d19c9d255cfd282532690b26ff6b12cc4c6315469508e096962e00f0b7c74414d09303a5b19dea2e9aaa6a0ad4
7
- data.tar.gz: 7b733990cbe89a546f0b033b2b68d7f0c124814fdfc7a9dcfa3de031a1e3c07393a7a11973a56b7a65a229cf675e5fc0844fa40cbabc2821fff8e2c6b48aa719
6
+ metadata.gz: cf487f698bae00c8c37a2dfd588ab7388bc122afcb312d2a441ba8fc7887cb80a1da80d7d3e2977ed31964fe37c1a6943e40de5931553a62c942b0cbaabc130c
7
+ data.tar.gz: db0e9bbfc4fdcd778885dbb30fc2a7f98a8594b5933fcd9e8c681f6853df2f28a0bc99097d41e4b675776d3aff1c04a8f506cc0592bea97e83a28c0cf14fafb6
data/lib/sgs/alarm.rb CHANGED
@@ -62,7 +62,7 @@ module SGS
62
62
  CROSS_TRACK_ERROR = 20
63
63
  INSIDE_FENCE = 21
64
64
 
65
- MESSAGES = [
65
+ ALARM_NAMES = [
66
66
  "OTTO Restarted",
67
67
  "Rudder Servo Fault",
68
68
  "Sail Servo Fault",
data/lib/sgs/otto.rb CHANGED
@@ -30,134 +30,110 @@
30
30
  #
31
31
  module SGS
32
32
  class Otto < RedisBase
33
- attr_reader :rudder, :sail, :compass, :twa
34
- attr_accessor :bvcal, :bical, :btcal, :svcal
33
+ attr_accessor :raw_rudder, :raw_sail, :raw_compass, :raw_awa, :raw_tc, :raw_ta
34
+ attr_accessor :mode, :rudder_m, :rudder_c, :sail_m, :sail_c
35
+ attr_accessor :bv_m, :bv_c, :bi_m, :bi_c, :bt_m, :bt_c, :sv_m, :sv_c
35
36
 
36
- def initialize
37
- @bvcal = 0.0
38
- @bical = 0.0
39
- @btcal = 0.0
40
- @svcal = 0.0
41
- @rudder = read_rudder
42
- @sail = read_sail
43
- @compass = read_compass
44
- @twa = read_twa
45
- super
46
- end
47
-
48
- #
49
- # Set the required rudder angle. Input values range from +/- 40 degrees
50
- def rudder=(val)
51
- val = -39.9 if val < -39.9
52
- val = 39.9 if val > 39.9
53
- return if @rudder == val
54
- @rudder = val
55
- intval = (@rudder * 120.0 / 40.0).to_int + 128
56
- puts "New rudder value: #{intval} (#{@rudder} degrees)"
57
- send_command(SET_RUDDER, intval)
58
- end
37
+ MODE_INERT = 0
38
+ MODE_DIAGNOSTICS = 1
39
+ MODE_MANUAL = 2
40
+ MODE_TRACK_COMPASS = 3
41
+ MODE_TRACK_AWA = 4
59
42
 
60
- #
61
- # Set the required sail angle. Input values range from 0 -> 90 degrees.
62
- def sail=(val)
63
- val = 0.0 if val < 0.0
64
- val = 90.0 if val > 90.0
65
- return if @sail == val
66
- @sail = val
67
- intval = (@sail * 256.0 / 90.0).to_int
68
- puts "New sail angle: #{intval} (#{@sail} degrees)"
69
- send_command(SET_SAIL, intval)
70
- end
43
+ MODE_NAMES = [
44
+ "Inert Mode", "Diagnostics Mode", "Manual Control Mode",
45
+ "Compass-Tracking Mode", "AWA-Tracking Mode"
46
+ ].freeze
71
47
 
72
48
  #
73
- # Set the required compass reading. Input values range from 0 -> 359 degrees
74
- def compass=(val)
75
- while val < 0.0
76
- val += 360.0
77
- end
78
- val %= 360.0
79
- return if @compass == val
80
- @compass = val
81
- intval = (@compass * 256.0 / 360.0).to_int
82
- puts "New compass heading: #{intval} (#{@compass} degrees)"
83
- send_command(SET_COMPASS, intval)
49
+ # Set up some useful defaults. We assume rudder goes from 0 to 200 as does
50
+ # the sail angle.
51
+ def initialize
52
+ #
53
+ # Configure the Mx + C values for sail and rudder
54
+ @rudder_m = 2.5
55
+ @rudder_c = 100.0
56
+ @sail_m = 2.0
57
+ @sail_c = 0.0
58
+ #
59
+ # Now set the rudder and sail to default positions (rudder is centered)
60
+ rudder = 0.0
61
+ sail = 0.0
62
+ #
63
+ # Set up some basic parameters for battery/solar readings
64
+ @bv_m = @bi_m = @bt_m = @sv_m = 1.0
65
+ @bv_c = @bi_c = @bt_c = @sv_c = 0.0
66
+ super
84
67
  end
85
68
 
86
69
  #
87
- # Set the required true wind angle. Input values range from +/- 180 degrees
88
- def twa=(val)
89
- val = -179.9 if val < -179.9
90
- val = 179.9 if val > 179.9
91
- return if @twa == val
92
- @twa = val
93
- val = 360.0 + val if val < 0.0
94
- intval = (val * 256.0 / 360.0).to_int
95
- puts "New TWA: #{intval} (#{@twa} degrees)"
96
- send_command(SET_TWA, intval)
70
+ # Set the required rudder angle. Input values range from +/- 40.0 degrees
71
+ def rudder=(val)
72
+ val = -40.0 if val < -40.0
73
+ val = 40.0 if val > 40.0
74
+ @raw_rudder = (@rudder_m * val.to_f + @rudder_c).to_i
97
75
  end
98
76
 
99
77
  #
100
- # Read the uptime clock
101
- def read_uptime
102
- intval = send_command(READ_UPTIME)
78
+ # Return the rudder angle in degrees
79
+ def rudder
80
+ (@raw_rudder.to_f - @rudder_c) / @rudder_m
103
81
  end
104
82
 
105
83
  #
106
- # Read the battery voltage
107
- def read_battery_volts
108
- intval = send_command(READ_BATTERY_VOLTAGE)
109
- intval.to_f * @bvcal / 1024.0
84
+ # Set the required sail angle. Input values range from 0 -> 90 degrees.
85
+ def sail=(val)
86
+ val = 0.0 if val < 0.0
87
+ val = 100.0 if val > 100.0
88
+ @raw_sail = (@sail_m * val.to_f + @sail_c).to_i
110
89
  end
111
90
 
112
91
  #
113
- # Read the battery current
114
- def read_battery_current
115
- intval = send_command(READ_BATTERY_CURRENT)
116
- intval.to_f * @bical / 1024.0
92
+ # Return the sail setting (0.0 -> 100.0)
93
+ def sail
94
+ (@raw_sail.to_f - @sail_c) / @sail_m
117
95
  end
118
96
 
119
97
  #
120
- # Read the boat temperature
121
- def read_boat_temperature
122
- intval = send_command(READ_BOAT_TEMPERATURE)
123
- intval.to_f * @btcal / 1024.0
98
+ # Return the compass angle (in radians)
99
+ def compass
100
+ @raw_compass.to_f * Math::PI / 128.0
124
101
  end
125
102
 
126
103
  #
127
- # Read the solar voltage
128
- def read_solar_volts
129
- intval = send_command(READ_SOLAR_VOLTAGE)
130
- intval.to_f * @svcal / 1024.0
104
+ # Return the apparent wind angle (in radians)
105
+ def awa
106
+ @raw_awa.to_f * Math::PI / 128.0
131
107
  end
132
108
 
133
109
  #
134
- # Read the actual compass value
135
- def read_compass
136
- intval = send_command(GET_COMPASS)
137
- intval.to_f * 360.0 / 256.0
110
+ # Set the required compass reading. Input values range from 0 -> 359 degrees
111
+ def track_compass=(val)
112
+ while val < 0.0
113
+ val += 360.0
114
+ end
115
+ val %= 360.0
116
+ @raw_tc = (val.to_f * 128.0 / Math::PI).to_i
138
117
  end
139
118
 
140
119
  #
141
- # Read the actual TWA value
142
- def read_twa
143
- intval = send_command(GET_TWA)
144
- val = intval.to_f * 180.0 / 128.0
145
- val = val - 360.0 if val > 180.0
146
- val
120
+ # Return the compass value for tracking.
121
+ def track_compass
122
+ @raw_tc.to_f * Math::PI / 128.0
147
123
  end
148
124
 
149
125
  #
150
- # Read the actual boat pitch
151
- def read_pitch
152
- intval = send_command(GET_PITCH)
153
- intval.to_f
126
+ # Set the required AWA for tracking.
127
+ def track_awa=(val)
128
+ val = -180.0 if val < -180.0
129
+ val = 180.0 if val > 180.0
130
+ @raw_ta = (val.to_f * 128.0 / Math::PI).to_i
154
131
  end
155
132
 
156
133
  #
157
- # Read the actual boat heel
158
- def read_heel
159
- intval = send_command(GET_HEEL)
160
- intval.to_f
134
+ # Return the current tracking AWA.
135
+ def track_awa
136
+ @raw_ta.to_f * Math::PI / 128.0
161
137
  end
162
138
  end
163
139
  end
@@ -32,17 +32,18 @@ require 'redis'
32
32
 
33
33
  module SGS
34
34
  class RedisBase
35
- ##
35
+ class << self
36
+ def redis
37
+ puts "Class init"
38
+ @@redis ||= Redis.new
39
+ end
40
+ end
41
+
42
+ #
36
43
  # The base (inherited) class for dealing with Redis data for
37
44
  # the navigation system. Each model class inherits this parent,
38
45
  # and gets an update count for free.
39
46
 
40
- #
41
- # Initialize the base class.
42
- def initialize
43
- $redis = Redis.new unless $redis
44
- end
45
-
46
47
  #
47
48
  # Initialize the (sub-)class variables in Redis.
48
49
  def self.setup
@@ -67,7 +68,7 @@ module SGS
67
68
  # Initialize a Redis variable.
68
69
  def self.var_init(var, val, idx = nil)
69
70
  cls = new
70
- $redis.setnx cls.make_redis_name(var, :idx => idx), self.to_redis(var, val, idx)
71
+ SGS::RedisBase.redis.setnx cls.make_redis_name(var, :idx => idx), self.to_redis(var, val, idx)
71
72
  end
72
73
 
73
74
  #
@@ -133,11 +134,11 @@ module SGS
133
134
  #
134
135
  # Inside a multi-block, set all the variables and increment
135
136
  # the count.
136
- $redis.multi do
137
+ SGS::RedisBase.redis.multi do
137
138
  var_list.each do |key, value|
138
- $redis.set key, value
139
+ SGS::RedisBase.redis.set key, value
139
140
  end
140
- $redis.incr count_name
141
+ SGS::RedisBase.redis.incr count_name
141
142
  end
142
143
  true
143
144
  end
@@ -149,7 +150,7 @@ module SGS
149
150
  # class name), you can remember the last received count and decide if
150
151
  # there is fresh data. Or, you can just act anyway.
151
152
  def publish
152
- $redis.publish self.class.redis_handle, count.to_s
153
+ SGS::RedisBase.redis.publish self.class.redis_handle, count.to_s
153
154
  end
154
155
 
155
156
  #
@@ -174,7 +175,7 @@ module SGS
174
175
  #
175
176
  # Retrieve the count
176
177
  def count
177
- $redis.get count_name
178
+ SGS::RedisBase.redis.get count_name
178
179
  end
179
180
 
180
181
  #
@@ -187,7 +188,7 @@ module SGS
187
188
  # Get an instance variable value from a Redis value.
188
189
  def redis_read_var(var, klass, opts = {})
189
190
  redis_name = make_redis_name var, opts
190
- redis_val = $redis.get redis_name
191
+ redis_val = SGS::RedisBase.redis.get redis_name
191
192
  redis_val = nil if redis_val == ""
192
193
  if redis_val
193
194
  if not klass or klass == NilClass
data/lib/sgs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module SGS
2
- VERSION = "0.2.5"
2
+ VERSION = "0.2.6"
3
3
  end
data/lib/sgslib.rb CHANGED
@@ -36,7 +36,6 @@ require 'sgs/gps'
36
36
  require 'sgs/waypoint'
37
37
  require 'sgs/alarm'
38
38
  require 'sgs/timing'
39
- require 'sgs/command'
40
39
  require 'sgs/otto'
41
40
  require 'sgs/course'
42
41
  require 'sgs/navigate'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sgslib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dermot Tynan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-21 00:00:00.000000000 Z
11
+ date: 2018-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -85,7 +85,6 @@ files:
85
85
  - bin/console
86
86
  - bin/setup
87
87
  - lib/sgs/alarm.rb
88
- - lib/sgs/command.rb
89
88
  - lib/sgs/config.rb
90
89
  - lib/sgs/course.rb
91
90
  - lib/sgs/gps.rb
data/lib/sgs/command.rb DELETED
@@ -1,167 +0,0 @@
1
- #
2
- # Copyright (c) 2013, Kalopa Research. All rights reserved. This is free
3
- # software; you can redistribute it and/or modify it under the terms of the
4
- # GNU General Public License as published by the Free Software Foundation;
5
- # either version 2, or (at your option) any later version.
6
- #
7
- # It is distributed in the hope that it will be useful, but WITHOUT
8
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9
- # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
10
- # for more details.
11
- #
12
- # You should have received a copy of the GNU General Public License along
13
- # with this product; see the file COPYING. If not, write to the Free
14
- # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
15
- #
16
- # THIS SOFTWARE IS PROVIDED BY KALOPA RESEARCH "AS IS" AND ANY EXPRESS OR
17
- # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
- # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
- # IN NO EVENT SHALL KALOPA RESEARCH BE LIABLE FOR ANY DIRECT, INDIRECT,
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.
26
- #
27
-
28
- ##
29
- # Routines for handling sailboat alarms. Note that this is the definitive
30
- # list of alarms on the system. To add or modify an alarm, do so here.
31
- #
32
- module SGS
33
- ##
34
- # Deal with command subsystem.
35
- #
36
- # This code handles the Fonz packet commands.
37
- #
38
- class Command < RedisBase
39
- attr_accessor :last_received, :time
40
-
41
- FONZ_PING = 0
42
- FONZ_MAGIC = 1
43
- FONZ_ACK = 2
44
-
45
- FONZ_GET_TIMEL = 4
46
- FONZ_TIME_DATAL = 5
47
- FONZ_GET_TIMEH = 6
48
- FONZ_TIME_DATAH = 7
49
-
50
- FONZ_GET_VOLTS1 = 8
51
- FONZ_VOLTS1_DATA = 9
52
- FONZ_GET_VOLTS2 = 10
53
- FONZ_VOLTS2_DATA = 11
54
- FONZ_GET_VOLTS3 = 12
55
- FONZ_VOLTS3_DATA = 13
56
- FONZ_GET_VOLTS4 = 14
57
- FONZ_VOLTS4_DATA = 15
58
- FONZ_GET_VOLTS5 = 16
59
- FONZ_VOLTS5_DATA = 17
60
- FONZ_GET_VOLTS6 = 18
61
- FONZ_VOLTS6_DATA = 19
62
- FONZ_GET_VOLTS7 = 20
63
- FONZ_VOLTS7_DATA = 21
64
- FONZ_GET_VOLTS8 = 22
65
- FONZ_VOLTS8_DATA = 23
66
-
67
- FONZ_GET_CURR1 = 24
68
- FONZ_CURR1_DATA = 25
69
- FONZ_GET_CURR2 = 26
70
- FONZ_CURR2_DATA = 27
71
- FONZ_GET_CURR3 = 28
72
- FONZ_CURR3_DATA = 29
73
- FONZ_GET_CURR4 = 30
74
- FONZ_CURR4_DATA = 31
75
- FONZ_GET_CURR5 = 32
76
- FONZ_CURR5_DATA = 33
77
- FONZ_GET_CURR6 = 34
78
- FONZ_CURR6_DATA = 35
79
- FONZ_GET_CURR7 = 36
80
- FONZ_CURR7_DATA = 37
81
- FONZ_GET_CURR8 = 38
82
- FONZ_CURR8_DATA = 39
83
-
84
- FONZ_GET_ALARMS = 40
85
- FONZ_ALARM_RAISE = 41
86
-
87
- FONZ_GET_OTTORST = 42
88
- FONZ_OTTORST_DATA = 43
89
- FONZ_GET_MISSION = 44
90
- FONZ_MISSION_DATA = 45
91
- FONZ_GET_COMPASS = 46
92
- FONZ_COMPASS_DATA = 47
93
- FONZ_GET_TWA = 48
94
- FONZ_TWA_DATA = 49
95
- FONZ_GET_RUDDER = 50
96
- FONZ_RUDDER_DATA = 51
97
- FONZ_GET_SAIL = 52
98
- FONZ_SAIL_DATA = 53
99
- FONZ_GET_PDOWN = 54
100
- FONZ_PDOWN_DATA = 55
101
- FONZ_GET_NAVLIGHT = 56
102
- FONZ_NAVLIGHT_DATA = 57
103
- FONZ_GET_BUZZER = 58
104
- FONZ_BUZZER_DATA = 59
105
-
106
- FONZ_GET_EEADDR = 60
107
- FONZ_SET_EEADDR = 61
108
- FONZ_GET_EEDATA = 62
109
- FONZ_SET_EEDATA = 63
110
-
111
- MESSAGES = [
112
- "Ping", "Magic Word",
113
- "ACK", "??",
114
- "Get Time (Lo)", "Time Data (Lo)",
115
- "Get Time (Hi)", "Time Data (Hi)",
116
- "Get Voltage1", "Voltage1 Data",
117
- "Get Voltage2", "Voltage2 Data",
118
- "Get Voltage3", "Voltage3 Data",
119
- "Get Voltage4", "Voltage4 Data",
120
- "Get Voltage5", "Voltage5 Data",
121
- "Get Voltage6", "Voltage6 Data",
122
- "Get Voltage7", "Voltage7 Data",
123
- "Get Voltage8", "Voltage8 Data",
124
- "Get Current1", "Current1 Data",
125
- "Get Current2", "Current2 Data",
126
- "Get Current3", "Current3 Data",
127
- "Get Current4", "Current4 Data",
128
- "Get Current5", "Current5 Data",
129
- "Get Current6", "Current6 Data",
130
- "Get Current7", "Current7 Data",
131
- "Get Current8", "Current8 Data",
132
- "Get Alarms", "Alarm Raised!",
133
- "Get Otto Reset", "Otto Reset Status",
134
- "Get Mission", "Mission Data",
135
- "Get Compass", "Compass Data",
136
- "Get TWA", "TWA Data",
137
- "Get Rudder Position", "Rudder Position Data",
138
- "Get Sail Trim", "Sail Trim Data",
139
- "Get Power Down", "Time to Power Down",
140
- "Get Nav Light", "Nav Light Status",
141
- "Get Buzzer", "Buzzer Status",
142
- "Get EEPROM Address", "Set EEPROM Address",
143
- "Get EEPROM Data", "Set EEPROM Data"
144
- ].freeze
145
-
146
- def initialize
147
- @count = 0
148
- @last_report = nil
149
- @time = Array.new(32, Time.at(0))
150
- super
151
- end
152
-
153
- #
154
- # Convert a command code into a string.
155
- def name(code)
156
- (code < MESSAGES.count) ? MESSAGES[code] : nil
157
- end
158
-
159
- #
160
- # Send a command to the microcontroller
161
- def send_command(cmd, arg = nil)
162
- puts "Send command #{cmd} (#{name(cmd)})"
163
- puts "Arg is #{arg}" if arg
164
- return 0
165
- end
166
- end
167
- end