mi100 0.3.0 → 0.3.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.
data/lib/mi100.rb CHANGED
@@ -1,3 +1,9 @@
1
+ # mi100.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
+
1
7
  require 'mi100/version'
2
8
  require 'mi100/morsecoder'
3
9
  require 'timeout'
@@ -28,7 +34,30 @@ class Mi100
28
34
  DEFAULT_MOVE_DIRECTION = "FORWARD"
29
35
  DEFAULT_SPIN_DIRECTION = "RIGHT"
30
36
 
31
- FREQUENCY = {DO: 262, RE: 294, MI: 330, FA: 349, SO: 392, LA: 440, SI: 494, HDO: 523}
37
+ FREQUENCY = { DO: 262,
38
+ DOS: 277,
39
+ RE: 294,
40
+ RES: 311,
41
+ MI: 330,
42
+ FA: 349,
43
+ FAS: 370,
44
+ SO: 392,
45
+ SOS: 415,
46
+ LA: 440,
47
+ LAS: 466,
48
+ SI: 494,
49
+ HDO: 523,
50
+ HDOS: 554,
51
+ HRE: 587,
52
+ HRES: 622,
53
+ HMI: 659,
54
+ HFA: 698,
55
+ HFAS: 740,
56
+ HSO: 784,
57
+ HSOS: 831,
58
+ HLA: 880,
59
+ HSI: 988,
60
+ }
32
61
 
33
62
  def initialize(dev)
34
63
  retries_left = DEFAULT_RETRIES
@@ -42,8 +71,6 @@ class Mi100
42
71
  raise
43
72
  end
44
73
 
45
- @morsecoder = Morsecoder.new
46
-
47
74
  end
48
75
 
49
76
  def close
@@ -175,24 +202,24 @@ class Mi100
175
202
  end
176
203
 
177
204
  def talk(str)
178
- morsecode = @morsecoder.to_morse(str)
179
- morsecode.each {|code| sound(code[:frequency],code[:duration])}
205
+ morsecoder = Morsecoder.new str
206
+ morsecoder.each {|frequency, duration| sound(frequency,duration)}
180
207
  end
181
208
 
182
- def morsefrequency
183
- @morsecoder.morsefrequency
209
+ def morse_frequency
210
+ Morsecoder.default_frequency
184
211
  end
185
212
 
186
- def morsefrequency=(frequency)
187
- @morsecoder.morsefrequency = frequency
213
+ def morse_frequency=(frequency)
214
+ Morsecoder.default_frequency = frequency
188
215
  end
189
216
 
190
- def morseunit
191
- @morsecoder.morseunit
217
+ def morse_unit
218
+ Morsecoder.default_unit
192
219
  end
193
220
 
194
- def morseunit=(millisec)
195
- @morsecoder.morseunit = millisec
221
+ def morse_unit=(millisec)
222
+ Morsecoder.default_unit = millisec
196
223
  end
197
224
 
198
225
  # Private methods
@@ -6,11 +6,12 @@
6
6
 
7
7
  class Mi100
8
8
  class Morsecoder
9
-
10
- attr_accessor :morseunit, :morsefrequency
11
-
12
- DEFAULT_MORSEUNIT_MILLIS = 50
13
- DEFAULT_MORSEFREQUENCY = 4000
9
+
10
+ DEFAULT_MORSE_UNIT_MILLIS = 50
11
+ DEFAULT_MORSE_FREQUENCY = 4000
12
+ DEFAULT_LETTER_SPACE_DOTS = 3
13
+ DEFAULT_WORD_SPACE_DOTS = 7
14
+
14
15
  MORSECODE = {
15
16
  "1" => [1,3,3,3,3],
16
17
  "2" => [1,1,3,3,3],
@@ -58,28 +59,63 @@ class Mi100
58
59
  "(" => [3,1,3,3,1],
59
60
  ")" => [3,1,3,3,1,3]
60
61
  }
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}
62
+
63
+
64
+ @default_unit = DEFAULT_MORSE_UNIT_MILLIS
65
+ @default_frequency = DEFAULT_MORSE_FREQUENCY
66
+ @default_letter_space = DEFAULT_LETTER_SPACE_DOTS
67
+ @default_word_space = DEFAULT_WORD_SPACE_DOTS
68
+
69
+ class << self
70
+
71
+ attr_accessor :default_unit, :default_frequency
72
+
73
+ def to_morse_from(the_str, frequency = @default_frequency, unit = @default_unit)
74
+ letter_space = @default_letter_space
75
+ word_space = @default_word_space
76
+ morsecode = []
77
+
78
+ the_str.to_s.split(//).each do |char|
79
+ code = MORSECODE[char.upcase]
80
+ if code
81
+ code.each do |dots|
82
+ morsecode << {frequency: frequency, duration: unit * dots}
83
+ morsecode << {frequency: false, duration: unit * dots}
84
+ end
85
+ morsecode << {frequency: false, duration: unit * letter_space}
86
+ else
87
+ morsecode << {frequency: false, duration: unit * word_space}
75
88
  end
76
- morsecode << {frequency: false, duration: morseunit * 3}
77
- else
78
- morsecode << {frequency: false, duration: morseunit * 7}
79
89
  end
90
+
91
+ morsecode
80
92
  end
81
- morsecode
93
+
94
+ def reset
95
+ @default_unit = DEFAULT_MORSE_UNIT_MILLIS
96
+ @default_frequency = DEFAULT_MORSE_FREQUENCY
97
+ @default_letter_space = DEFAULT_LETTER_SPACE_DOTS
98
+ @default_word_space = DEFAULT_WORD_SPACE_DOTS
99
+ end
100
+
101
+ end
102
+
103
+ attr_accessor :str, :unit, :frequency
104
+
105
+ def initialize(str="HELLO WORLD", frequency = Morsecoder.default_frequency, unit=Morsecoder.default_unit)
106
+ @str = str
107
+ @frequency = frequency
108
+ @unit = unit
82
109
  end
83
110
 
111
+ def to_morse
112
+ frequency = @frequency
113
+ unit = @unit
114
+ Morsecoder.to_morse_from(@str, frequency, unit)
115
+ end
116
+
117
+ def each
118
+ to_morse.each {|code| yield(code[:frequency], code[:duration])}
119
+ end
84
120
  end
85
121
  end
data/lib/mi100/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Mi100
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
data/spec/mi100_spec.rb CHANGED
@@ -1,11 +1,252 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mi100 do
4
+
4
5
  it 'should have a version number' do
5
- Mi100::VERSION.should_not be_nil
6
+ expect(Mi100::VERSION).not_to be nil
7
+ end
8
+
9
+ before :each do
10
+ Mi100.any_instance.stub(:initialize_serialport)
11
+ end
12
+
13
+ it 'should create the instance' do
14
+ mi100 = Mi100.new "COM5"
15
+ expect(mi100).to be_a Mi100
6
16
  end
17
+
18
+ it 'should send "H" on :ping' do
19
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_PING,1234])
20
+ mi100 = Mi100.new "COM5"
21
+ expect(mi100.ping).to eq(["H",1234])
22
+ expect(mi100).to have_received(:send_command_get_response).with("H")
23
+ end
24
+
25
+ it 'should send "H" and return rounded power level on :power' do
26
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_GET_POWER_LEVEL,1188])
27
+ mi100 = Mi100.new "COM5"
28
+ expect(mi100.power).to eq(1.19)
29
+ expect(mi100).to have_received(:send_command_get_response).with("H")
30
+ end
31
+
32
+ it 'should send "P" and get light level on :light' do
33
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_GET_LIGHT,1188])
34
+ mi100 = Mi100.new "COM5"
35
+ expect(mi100.light).to eq(1188)
36
+ expect(mi100).to have_received(:send_command_get_response).with("P")
37
+ end
38
+
39
+ it 'should send "F,duration" on :move with "FORWARD"' do
40
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_MOVE_FORWARD,1234])
41
+ mi100 = Mi100.new "COM5"
42
+ expect(mi100.move "FORWARD").to eq(["F",1234])
43
+ expect(mi100).to have_received(:send_command_get_response).with("F,300")
44
+ end
45
+
46
+ it 'should send "B,duration" on move "BACKWARD"' do
47
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_MOVE_BACKWARD,1234])
48
+ mi100 = Mi100.new "COM5"
49
+ expect(mi100.move "BACKWARD").to eq(["B",1234])
50
+ expect(mi100).to have_received(:send_command_get_response).with("B,300")
51
+ end
7
52
 
8
- it 'should do something useful' do
9
- false.should be_true
53
+ it 'should send "R,140" on spin "RIGHT"' do
54
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_SPIN_RIGHT,1234])
55
+ mi100 = Mi100.new "COM5"
56
+ expect(mi100.spin "RIGHT").to eq(["R",1234])
57
+ expect(mi100).to have_received(:send_command_get_response).with("R,140")
58
+ end
59
+
60
+ it 'should send "L,140" on spin "LEFT"' do
61
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_SPIN_LEFT,1234])
62
+ mi100 = Mi100.new "COM5"
63
+ expect(mi100.spin "LEFT").to eq(["L",1234])
64
+ expect(mi100).to have_received(:send_command_get_response).with("L,140")
65
+ end
66
+
67
+ it 'should send "F,duration" on move_forward duration' do
68
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_MOVE_FORWARD,1234])
69
+ mi100 = Mi100.new "COM5"
70
+ expect(mi100.move_forward 500).to eq(["F",1234])
71
+ expect(mi100).to have_received(:send_command_get_response).with("F,500")
72
+ end
73
+
74
+ it 'should send "B,duration" move_backward duration' do
75
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_MOVE_BACKWARD,1234])
76
+ mi100 = Mi100.new "COM5"
77
+ expect(mi100.move_backward 500).to eq(["B",1234])
78
+ expect(mi100).to have_received(:send_command_get_response).with("B,500")
79
+ end
80
+
81
+ it 'should send "R,duration" spin_right duration' do
82
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_SPIN_RIGHT,1234])
83
+ mi100 = Mi100.new "COM5"
84
+ expect(mi100.spin_right 500).to eq(["R",1234])
85
+ expect(mi100).to have_received(:send_command_get_response).with("R,500")
86
+ end
87
+
88
+ it 'should send "L,duration" on spin_left duration' do
89
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_SPIN_LEFT,1234])
90
+ mi100 = Mi100.new "COM5"
91
+ expect(mi100.spin_left 500).to eq(["L",1234])
92
+ expect(mi100).to have_received(:send_command_get_response).with("L,500")
93
+ end
94
+
95
+ it 'should send "F, 300" on movef' do
96
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_MOVE_FORWARD,1234])
97
+ mi100 = Mi100.new "COM5"
98
+ expect(mi100.movef).to eq(["F",1234])
99
+ expect(mi100).to have_received(:send_command_get_response).with("F,300")
100
+ end
101
+
102
+ it 'should send "B,300" on moveb' do
103
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_MOVE_BACKWARD,1234])
104
+ mi100 = Mi100.new "COM5"
105
+ expect(mi100.moveb).to eq(["B",1234])
106
+ expect(mi100).to have_received(:send_command_get_response).with("B,300")
107
+ end
108
+
109
+ it 'should send "R,140" spinr' do
110
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_SPIN_RIGHT,1234])
111
+ mi100 = Mi100.new "COM5"
112
+ expect(mi100.spinr).to eq(["R",1234])
113
+ expect(mi100).to have_received(:send_command_get_response).with("R,140")
114
+ end
115
+
116
+ it 'should send "L,140" on spinl' do
117
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_SPIN_LEFT,1234])
118
+ mi100 = Mi100.new "COM5"
119
+ expect(mi100.spinl).to eq(["L",1234])
120
+ expect(mi100).to have_received(:send_command_get_response).with("L,140")
121
+ end
122
+
123
+ it 'should send "F,duration" on move_forward! duration in async (via sendln)' do
124
+ Mi100.any_instance.stub(:sendln => 6)
125
+ mi100 = Mi100.new "COM5"
126
+ expect(mi100.move_forward! 500).to eq(6)
127
+ expect(mi100).to have_received(:sendln).with("F,500")
128
+ end
129
+
130
+ it 'should send "B,duration" on move_backward! duration in async' do
131
+ Mi100.any_instance.stub(:sendln => 6)
132
+ mi100 = Mi100.new "COM5"
133
+ expect(mi100.move_backward! 500).to eq(6)
134
+ expect(mi100).to have_received(:sendln).with("B,500")
135
+ end
136
+
137
+ it 'should send "R,duration" on spin_right! duration in async' do
138
+ Mi100.any_instance.stub(:sendln => 6)
139
+ mi100 = Mi100.new "COM5"
140
+ expect(mi100.spin_right! 500).to eq(6)
141
+ expect(mi100).to have_received(:sendln).with("R,500")
142
+ end
143
+
144
+ it 'should send "L,duration" on spin_left! duration in async' do
145
+ Mi100.any_instance.stub(:sendln => 6)
146
+ mi100 = Mi100.new "COM5"
147
+ expect(mi100.spin_left! 500).to eq(6)
148
+ expect(mi100).to have_received(:sendln).with("L,500")
149
+ end
150
+
151
+ it 'should send "D,100, 50, 50,duration on blink 100,50,50,duration' do
152
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_BLINK_LED,1234])
153
+ mi100 = Mi100.new "COM5"
154
+ expect(mi100.blink 100,50,50,100).to eq(["D",1234])
155
+ expect(mi100).to have_received(:send_command_get_response).with("D,100,50,50,100")
156
+ end
157
+
158
+ it 'should send "S" on stop' do
159
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_STOP,1234])
160
+ mi100 = Mi100.new "COM5"
161
+ expect(mi100.stop).to eq(["S",1234])
162
+ expect(mi100).to have_received(:send_command_get_response).with("S")
163
+ end
164
+
165
+ it 'should send "T,random frequency, 300" on tone' do
166
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_TONE,1234])
167
+ mi100 = Mi100.new "COM5"
168
+ expect(mi100.tone).to eq(["T",1234])
169
+ expect(mi100).to have_received(:send_command_get_response).with(/T,\d{2,4},300/)
170
+ end
171
+
172
+ it 'should limit minimum tone frequency to 28 on tome' do
173
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_TONE,1234])
174
+ mi100 = Mi100.new "COM5"
175
+ mi100.tone 20, 500
176
+ expect(mi100).to have_received(:send_command_get_response).with("T,28,500")
177
+ end
178
+
179
+ it 'should send "T,440,1000" on sound "la", 1000' do
180
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_TONE,1234])
181
+ mi100 = Mi100.new "COM5"
182
+ mi100.sound "la",1000
183
+ expect(mi100).to have_received(:send_command_get_response).with("T,440,1000")
184
+ end
185
+
186
+ it 'sound should not call tone with false frequency' do
187
+ mi100 = Mi100.new "COM5"
188
+ mi100.stub(:tone)
189
+ mi100.sound false, 300
190
+ expect(mi100).not_to have_received(:tone)
191
+ end
192
+
193
+ it 'should send three good tones on good' do
194
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_TONE,1234])
195
+ mi100 = Mi100.new "COM5"
196
+ mi100.good
197
+ expect(mi100).to have_received(:send_command_get_response).exactly(3).times
198
+ end
199
+
200
+ it 'should send one bad tone on bad' do
201
+ Mi100.any_instance.stub(:send_command_get_response => [Mi100::CMD_TONE,1234])
202
+ mi100 = Mi100.new "COM5"
203
+ mi100.bad
204
+ expect(mi100).to have_received(:send_command_get_response).once
205
+ end
206
+
207
+ it 'should talk morse code' do
208
+ mi100 = Mi100.new "COM5"
209
+ mi100.stub(:tone)
210
+ mi100.talk "sos"
211
+ expect(mi100).to have_received(:tone).exactly(6).times.with(4000,50)
212
+ expect(mi100).to have_received(:tone).exactly(3).times.with(4000,150)
213
+ end
214
+
215
+ it 'should access to morse_frequency' do
216
+ mi100 = Mi100.new "COM5"
217
+ expect(mi100.morse_frequency).to eq(4000)
218
+ expect(mi100.morse_frequency = 440).to eq(440)
219
+ expect(mi100.morse_frequency).to eq(440)
220
+ end
221
+
222
+ it 'should access to morse_unit' do
223
+ mi100 = Mi100.new "COM5"
224
+ expect(mi100.morse_unit).to eq(50)
225
+ expect(mi100.morse_unit = 100).to eq(100)
226
+ expect(mi100.morse_unit).to eq(100)
227
+ end
228
+
229
+ it 'should talk with new default frequency and unit' do
230
+ mi100 = Mi100.new "COM5"
231
+ mi100.stub(:tone)
232
+ mi100.talk "sos"
233
+ expect(mi100).to have_received(:tone).exactly(6).times.with(440,100)
234
+ expect(mi100).to have_received(:tone).exactly(3).times.with(440,300)
235
+ end
236
+
237
+ it 'should reset default frequency and unit' do
238
+ Mi100::Morsecoder.reset
239
+ expect(Mi100::Morsecoder.default_frequency).to eq(4000)
240
+ expect(Mi100::Morsecoder.default_unit).to eq(50)
241
+ mi100 = Mi100.new "COM5"
242
+ expect(mi100.morse_frequency).to eq(4000)
243
+ expect(mi100.morse_unit).to eq(50)
10
244
  end
245
+
246
+ it 'should provide Morsecode.to_morse_from class method converting the string to the morse code array' do
247
+ morsecode = Mi100::Morsecoder.to_morse_from "sos"
248
+ expect(morsecode.size).to eq(21)
249
+ expect(morsecode[0]).to eq ({:frequency=>4000, :duration=>50})
250
+ end
251
+
11
252
  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.3.0
4
+ version: 0.3.1
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-03-27 00:00:00.000000000Z
12
+ date: 2014-03-29 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &16038924 !ruby/object:Gem::Requirement
16
+ requirement: &16171272 !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: *16038924
24
+ version_requirements: *16171272
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &16038672 !ruby/object:Gem::Requirement
27
+ requirement: &16171020 !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: *16038672
35
+ version_requirements: *16171020
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &16038396 !ruby/object:Gem::Requirement
38
+ requirement: &16170744 !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: *16038396
46
+ version_requirements: *16170744
47
47
  description: A ruby gem for controlling MI100 of monoxit through bluetooth virtual
48
48
  serial port.
49
49
  email: