mi100 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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: