mi100 0.2.0 → 0.3.0
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.
- data/lib/mi100/morsecoder.rb +85 -0
- data/lib/mi100/version.rb +1 -1
- data/lib/mi100.rb +75 -46
- metadata +9 -8
@@ -0,0 +1,85 @@
|
|
1
|
+
# morsecoder.rb
|
2
|
+
# Copyright (c) 2014 Masami Yamakawa
|
3
|
+
#
|
4
|
+
# This software is released under the MIT License.
|
5
|
+
# http://opensource.org/lisenses/mit-license.php
|
6
|
+
|
7
|
+
class Mi100
|
8
|
+
class Morsecoder
|
9
|
+
|
10
|
+
attr_accessor :morseunit, :morsefrequency
|
11
|
+
|
12
|
+
DEFAULT_MORSEUNIT_MILLIS = 50
|
13
|
+
DEFAULT_MORSEFREQUENCY = 4000
|
14
|
+
MORSECODE = {
|
15
|
+
"1" => [1,3,3,3,3],
|
16
|
+
"2" => [1,1,3,3,3],
|
17
|
+
"3" => [1,1,1,3,3],
|
18
|
+
"4" => [1,1,1,1,3],
|
19
|
+
"5" => [1,1,1,1,1],
|
20
|
+
"6" => [3,1,1,1,1],
|
21
|
+
"7" => [3,3,1,1,1],
|
22
|
+
"8" => [3,3,3,1,1],
|
23
|
+
"9" => [3,3,3,3,1],
|
24
|
+
"0" => [3,3,3,3,3],
|
25
|
+
"A" => [1,3],
|
26
|
+
"B" => [3,1,1,1],
|
27
|
+
"C" => [3,1,3,1],
|
28
|
+
"D" => [3,1,1],
|
29
|
+
"E" => [1],
|
30
|
+
"F" => [1,1,3,1],
|
31
|
+
"G" => [3,3,1],
|
32
|
+
"H" => [1,1,1,1],
|
33
|
+
"I" => [1,1],
|
34
|
+
"J" => [1,3,3,3],
|
35
|
+
"K" => [1,3,1,1],
|
36
|
+
"L" => [1,3,1,1],
|
37
|
+
"M" => [3,3],
|
38
|
+
"N" => [3,1],
|
39
|
+
"O" => [3,3,3],
|
40
|
+
"P" => [1,3,3,1],
|
41
|
+
"Q" => [3,3,1,3],
|
42
|
+
"R" => [1,3,1],
|
43
|
+
"S" => [1,1,1],
|
44
|
+
"T" => [3],
|
45
|
+
"U" => [1,1,3],
|
46
|
+
"V" => [1,1,1,3],
|
47
|
+
"W" => [1,3,3],
|
48
|
+
"X" => [3,1,1,3],
|
49
|
+
"Y" => [3,1,3,3],
|
50
|
+
"Z" => [3,3,1,1],
|
51
|
+
"." => [1,3,1,3,1,3],
|
52
|
+
"," => [3,3,1,1,3,3],
|
53
|
+
"?" => [1,1,3,3,1,1],
|
54
|
+
"!" => [3,1,3,1,3,3],
|
55
|
+
"-" => [3,1,1,1,1,3],
|
56
|
+
"/" => [3,1,1,3,1],
|
57
|
+
"@" => [1,3,3,1,3,1],
|
58
|
+
"(" => [3,1,3,3,1],
|
59
|
+
")" => [3,1,3,3,1,3]
|
60
|
+
}
|
61
|
+
|
62
|
+
def initialize
|
63
|
+
@morseunit = DEFAULT_MORSEUNIT_MILLIS
|
64
|
+
@morsefrequency = DEFAULT_MORSEFREQUENCY
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_morse(str)
|
68
|
+
morsecode = []
|
69
|
+
str.split(//).each do |char|
|
70
|
+
code = MORSECODE[char.upcase]
|
71
|
+
if code
|
72
|
+
code.each do |dots|
|
73
|
+
morsecode << {frequency: @morsefrequency, duration: @morseunit * dots}
|
74
|
+
morsecode << {frequency: false, duration: @morseunit * dots}
|
75
|
+
end
|
76
|
+
morsecode << {frequency: false, duration: morseunit * 3}
|
77
|
+
else
|
78
|
+
morsecode << {frequency: false, duration: morseunit * 7}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
morsecode
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
data/lib/mi100/version.rb
CHANGED
data/lib/mi100.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require 'mi100/version'
|
2
|
+
require 'mi100/morsecoder'
|
2
3
|
require 'timeout'
|
3
4
|
|
4
5
|
class Mi100
|
5
6
|
|
6
|
-
DEFAULT_RETRIES =
|
7
|
+
DEFAULT_RETRIES = 5
|
7
8
|
READ_TIMEOUT = 5000
|
8
9
|
WRITE_TIMEOUT = 5000
|
9
10
|
SHORT_READ_TIMEOUT = 1
|
@@ -34,11 +35,15 @@ class Mi100
|
|
34
35
|
begin
|
35
36
|
initialize_serialport dev
|
36
37
|
rescue Errno::ENOENT
|
37
|
-
puts retries_left
|
38
|
+
puts "Retry Bluetooth connection: #{retries_left.to_s}"
|
38
39
|
retries_left -= 1
|
39
40
|
retry unless retries_left < 0
|
41
|
+
puts "Bluetooth connection failed."
|
40
42
|
raise
|
41
43
|
end
|
44
|
+
|
45
|
+
@morsecoder = Morsecoder.new
|
46
|
+
|
42
47
|
end
|
43
48
|
|
44
49
|
def close
|
@@ -63,28 +68,28 @@ class Mi100
|
|
63
68
|
|
64
69
|
def move(direction = DEFAULT_MOVE_DIRECTION, duration = DEFAULT_MOVE_DURATION)
|
65
70
|
cmd = direction.upcase == "BACKWARD" ? CMD_MOVE_BACKWARD : CMD_MOVE_FORWARD
|
66
|
-
send_command_get_response cmd
|
71
|
+
send_command_get_response "#{cmd},#{duration.to_s}"
|
67
72
|
end
|
68
73
|
|
69
74
|
def spin(direction = DEFAULT_SPIN_DIRECTION, duration = DEFAULT_SPIN_DURATION)
|
70
75
|
cmd = direction.upcase == "LEFT" ? CMD_SPIN_LEFT : CMD_SPIN_RIGHT
|
71
|
-
send_command_get_response cmd
|
76
|
+
send_command_get_response "#{cmd},#{duration.to_s}"
|
72
77
|
end
|
73
78
|
|
74
79
|
def move_forward(duration)
|
75
|
-
send_command_get_response CMD_MOVE_FORWARD
|
80
|
+
send_command_get_response "#{CMD_MOVE_FORWARD},#{duration.to_s}"
|
76
81
|
end
|
77
82
|
|
78
83
|
def move_backward(duration)
|
79
|
-
send_command_get_response CMD_MOVE_BACKWARD
|
84
|
+
send_command_get_response "#{CMD_MOVE_BACKWARD},#{duration.to_s}"
|
80
85
|
end
|
81
86
|
|
82
87
|
def spin_right(duration)
|
83
|
-
send_command_get_response CMD_SPIN_RIGHT
|
88
|
+
send_command_get_response "#{CMD_SPIN_RIGHT},#{duration.to_s}"
|
84
89
|
end
|
85
90
|
|
86
91
|
def spin_left(duration)
|
87
|
-
send_command_get_response CMD_SPIN_LEFT
|
92
|
+
send_command_get_response "#{CMD_SPIN_LEFT},#{duration.to_s}"
|
88
93
|
end
|
89
94
|
|
90
95
|
def movef(duration = DEFAULT_MOVE_DURATION)
|
@@ -104,65 +109,90 @@ class Mi100
|
|
104
109
|
end
|
105
110
|
|
106
111
|
def move_forward!(duration)
|
107
|
-
sendln CMD_MOVE_FORWARD
|
112
|
+
sendln "#{CMD_MOVE_FORWARD},#{duration.to_s}"
|
108
113
|
end
|
109
114
|
|
110
115
|
def move_backward!(duration)
|
111
|
-
sendln CMD_MOVE_BACKWARD
|
116
|
+
sendln "#{CMD_MOVE_BACKWARD},#{duration.to_s}"
|
112
117
|
end
|
113
118
|
|
114
119
|
def spin_right!(duration)
|
115
|
-
sendln CMD_SPIN_RIGHT
|
120
|
+
sendln "#{CMD_SPIN_RIGHT},#{duration.to_s}"
|
116
121
|
end
|
117
122
|
|
118
123
|
def spin_left!(duration)
|
119
|
-
sendln CMD_SPIN_LEFT
|
124
|
+
sendln "#{CMD_SPIN_LEFT},#{duration.to_s}"
|
120
125
|
end
|
121
126
|
|
122
|
-
def blink(r =
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
r = r <= 100 ? r : 100
|
131
|
-
g = g <= 100 ? g : 100
|
132
|
-
b = b <= 100 ? b : 100
|
133
|
-
|
134
|
-
send_command_get_response CMD_BLINK_LED + "," + r.to_s + "," + g.to_s + "," + b.to_s + "," + duration.to_s
|
127
|
+
def blink(r = nil, g = nil, b = nil, duration = DEFAULT_BLINK_DURATION)
|
128
|
+
r ||= rand(100)+1
|
129
|
+
g ||= rand(100)+1
|
130
|
+
b ||= rand(100)+1
|
131
|
+
r = 100 if r > 100
|
132
|
+
g = 100 if g > 100
|
133
|
+
b = 100 if b > 100
|
134
|
+
send_command_get_response "#{CMD_BLINK_LED},#{r.to_s},#{g.to_s},#{b.to_s},#{duration.to_s}"
|
135
135
|
end
|
136
136
|
|
137
137
|
def stop
|
138
138
|
send_command_get_response CMD_STOP
|
139
139
|
end
|
140
140
|
|
141
|
-
|
142
|
-
|
143
|
-
frequency =
|
144
|
-
|
141
|
+
def tone(frequency = nil, duration = DEFAULT_TONE_DURATION)
|
142
|
+
frequency ||= rand(4186 - 28) + 28
|
143
|
+
frequency = 4186 if frequency > 4186
|
144
|
+
frequency = 28 if frequency < 28
|
145
|
+
send_command_get_response "#{CMD_TONE},#{frequency.to_s},#{duration.to_s}"
|
145
146
|
end
|
146
147
|
|
147
|
-
|
148
|
-
|
149
|
-
pitch
|
150
|
-
|
148
|
+
def sound(pitch = "?", duration = DEFAULT_TONE_DURATION)
|
149
|
+
|
150
|
+
if pitch.instance_of?(String)
|
151
|
+
pitch = FREQUENCY.keys[rand(FREQUENCY.size)].to_s if pitch == "?"
|
152
|
+
frequency = FREQUENCY[pitch.upcase.to_sym]
|
153
|
+
else
|
154
|
+
frequency = pitch
|
155
|
+
end
|
156
|
+
|
157
|
+
tone frequency, duration if frequency
|
151
158
|
sleep duration.to_f / 1000.0
|
152
159
|
end
|
153
160
|
|
154
161
|
def good
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
162
|
+
freqs = [440,880,1760]
|
163
|
+
duration = 100.0
|
164
|
+
freqs.each do |freq|
|
165
|
+
tone freq, duration
|
166
|
+
sleep duration / 1000.0
|
167
|
+
end
|
161
168
|
end
|
162
169
|
|
163
170
|
def bad
|
164
|
-
|
165
|
-
|
171
|
+
duration = 400.0
|
172
|
+
freq = 100
|
173
|
+
tone freq, duration
|
174
|
+
sleep duration / 1000.0
|
175
|
+
end
|
176
|
+
|
177
|
+
def talk(str)
|
178
|
+
morsecode = @morsecoder.to_morse(str)
|
179
|
+
morsecode.each {|code| sound(code[:frequency],code[:duration])}
|
180
|
+
end
|
181
|
+
|
182
|
+
def morsefrequency
|
183
|
+
@morsecoder.morsefrequency
|
184
|
+
end
|
185
|
+
|
186
|
+
def morsefrequency=(frequency)
|
187
|
+
@morsecoder.morsefrequency = frequency
|
188
|
+
end
|
189
|
+
|
190
|
+
def morseunit
|
191
|
+
@morsecoder.morseunit
|
192
|
+
end
|
193
|
+
|
194
|
+
def morseunit=(millisec)
|
195
|
+
@morsecoder.morseunit = millisec
|
166
196
|
end
|
167
197
|
|
168
198
|
# Private methods
|
@@ -199,10 +229,9 @@ class Mi100
|
|
199
229
|
|
200
230
|
def empty_receive_buffer
|
201
231
|
@sp.read_timeout = SHORT_READ_TIMEOUT
|
202
|
-
|
203
|
-
while char.length > 0
|
232
|
+
begin
|
204
233
|
char = @sp.read 1
|
205
|
-
end
|
234
|
+
end while char && char.length > 0
|
206
235
|
@sp.read_timeout = READ_TIMEOUT
|
207
236
|
end
|
208
237
|
|
@@ -218,7 +247,7 @@ class Mi100
|
|
218
247
|
end
|
219
248
|
end
|
220
249
|
else
|
221
|
-
str = @sp.
|
250
|
+
str = @sp.gets
|
222
251
|
end
|
223
252
|
str
|
224
253
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mi100
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-03-27 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
16
|
-
requirement: &
|
16
|
+
requirement: &16038924 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '1.3'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16038924
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &16038672 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16038672
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &16038396 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16038396
|
47
47
|
description: A ruby gem for controlling MI100 of monoxit through bluetooth virtual
|
48
48
|
serial port.
|
49
49
|
email:
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- README.md
|
61
61
|
- Rakefile
|
62
62
|
- lib/mi100.rb
|
63
|
+
- lib/mi100/morsecoder.rb
|
63
64
|
- lib/mi100/version.rb
|
64
65
|
- mi100.gemspec
|
65
66
|
- spec/mi100_spec.rb
|