blinkytape-orb 0.0.2 → 0.1.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.
- checksums.yaml +8 -8
- data/LICENSE.md +3 -3
- data/README.md +13 -13
- data/arduino/blinkytape_orb.ino +21 -24
- data/lib/blinkytape-orb.rb +2 -2
- data/lib/blinkytape-orb/version.rb +1 -1
- data/spec/lib/blinkytape-orb_spec.rb +14 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YjQxZWMwMDhjNTA2NzQ0ZmMxM2IzMTA3ZGE3OWY5OWM5NDZmN2RiYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NjE5ZDU0MDcyYWRiYWMzOTBhYTRhOTMyYzJjY2NlYzMzZTA1ZWNkYw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MmViNWViMmNkN2E2N2E2MmI5MjA0M2Y1NWVkY2UxOWYzODVlOTIxMWRjM2Fm
|
10
|
+
NGVmZjQ3MjBhNDI3ZmI1NjU2MzU4N2E3OGFiNTkwOGY2ZTNmYmVmZDgyODc4
|
11
|
+
MWIxYWQxN2Y0NGVhMWQ3YzZjZDUzOTQ0ZjcyMWVkNTEwNDVmZWQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTg4ZjZmY2FkMDg0YTY0ZTViZDEyOWE1YjY4ODViZDRhODI4ZWE0NzY2YWFh
|
14
|
+
NDM5OWE4N2M2NGQwMDVkMDUzYjgyNjk4MWVjZGM4MjI4ZTZmOTMxNmY1NWNk
|
15
|
+
ODc3MDBjNjQzZWI4Zjc3YmNjZWZmZmUzZjQ0YzM1Y2Y4ZDJhMzU=
|
data/LICENSE.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
The MIT License (MIT)
|
1
|
+
## The MIT License (MIT)
|
2
2
|
|
3
3
|
Copyright (c) 2016 Jon Tai
|
4
4
|
|
@@ -20,13 +20,13 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
21
|
SOFTWARE.
|
22
22
|
|
23
|
-
|
23
|
+
---
|
24
24
|
|
25
25
|
Hardware initialization and interrupt handling arduino code was copied from
|
26
26
|
https://github.com/Blinkinlabs/BlinkyTape_Arduino, which has the following
|
27
27
|
license:
|
28
28
|
|
29
|
-
The MIT License (MIT)
|
29
|
+
## The MIT License (MIT)
|
30
30
|
|
31
31
|
Copyright (c) 2013 Blinkinlabs, LLC
|
32
32
|
|
data/README.md
CHANGED
@@ -19,7 +19,7 @@ display everything. This protocol is required for compatibility with BlinkyTape
|
|
19
19
|
software such as [PatternPaint](http://blinkinlabs.com/blinkytape/patternpaint/).
|
20
20
|
|
21
21
|
On the other hand, the Ambient Orb accepts a color and animation, encoded as
|
22
|
-
ASCII. After recieving
|
22
|
+
ASCII. After recieving a command, the Orb continues to animate (pulse) on its
|
23
23
|
own. Like on the BlinkyTape, the button is used to cycle through several
|
24
24
|
brightness levels.
|
25
25
|
|
@@ -30,7 +30,7 @@ differences:
|
|
30
30
|
* Only 6 colors and 4 pulse speeds are accepted (vs. 37 and 10,
|
31
31
|
respectively)
|
32
32
|
* As a result, the serial protocol is simplified to 1 ASCII character per
|
33
|
-
|
33
|
+
command
|
34
34
|
* Brightness can be controlled via the serial protocol as well as via the
|
35
35
|
hardware button (it's unclear if the Orb allowed this as well)
|
36
36
|
* Animations were recreated from memory without comparing them side by side
|
@@ -79,19 +79,19 @@ sleep(3)
|
|
79
79
|
[ BlinkyTapeOrb::COLOR_YELLOW, BlinkyTapeOrb::PULSE_MED ],
|
80
80
|
[ BlinkyTapeOrb::COLOR_ORANGE, BlinkyTapeOrb::PULSE_MED ],
|
81
81
|
[ BlinkyTapeOrb::COLOR_RED, BlinkyTapeOrb::PULSE_FAST ],
|
82
|
-
].each do |(color,
|
83
|
-
orb.
|
82
|
+
].each do |(color, pulse)|
|
83
|
+
orb.setColorAndPulse(color, pulse)
|
84
84
|
sleep(10)
|
85
85
|
end
|
86
86
|
```
|
87
87
|
|
88
|
-
|
88
|
+
## Serial Protocol
|
89
89
|
|
90
|
-
The custom firmware accepts a single ASCII character per
|
91
|
-
|
92
|
-
|
90
|
+
The custom firmware accepts a single ASCII character per command. Color and
|
91
|
+
pulse speed commands encode both attributes in a single character. In
|
92
|
+
brightness commands, a single character corresponds to a single brightness.
|
93
93
|
|
94
|
-
|
94
|
+
### Color and Pulse Speed
|
95
95
|
|
96
96
|
The two lowest bits encode the pulse speed:
|
97
97
|
|
@@ -123,7 +123,7 @@ In other words, "A" is red with no pulsing, followed by "B" for slow pulsing,
|
|
123
123
|
"C" for medium pulsing, and "D" for fast pulsing. "E" is orange with no
|
124
124
|
pulsing, "F" is orange with slow pulsing, etc.
|
125
125
|
|
126
|
-
|
126
|
+
### Brightness
|
127
127
|
|
128
128
|
There are three settings encoded in two bits:
|
129
129
|
|
@@ -131,14 +131,14 @@ There are three settings encoded in two bits:
|
|
131
131
|
* `01` - Medium
|
132
132
|
* `10` - Bright
|
133
133
|
|
134
|
-
These are "shifted up" by
|
134
|
+
These are "shifted up" by 60 (ASCII "<"). So "<" is dim, "=" is medium, and ">"
|
135
135
|
is bright. The Ruby one-liner for encoding is:
|
136
136
|
|
137
137
|
```ruby
|
138
|
-
('
|
138
|
+
('<'.ord + brightness).chr
|
139
139
|
```
|
140
140
|
|
141
|
-
|
141
|
+
## Hardware Setup
|
142
142
|
|
143
143
|
I stuck the [BlinkyTape controller board](http://blinkinlabs.myshopify.com/collections/frontpage/products/blinkytape-control-board)
|
144
144
|
on the plastic base of the Orb with a small styrofoam riser (poor man's 3D
|
data/arduino/blinkytape_orb.ino
CHANGED
@@ -45,30 +45,27 @@ void checkSerial() {
|
|
45
45
|
command = Serial.read();
|
46
46
|
}
|
47
47
|
|
48
|
-
// handle
|
49
|
-
//
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
command = prev_command;
|
70
|
-
}
|
71
|
-
break;
|
48
|
+
// handle certain commands immediately, then swallow the
|
49
|
+
// handled commands to prevent rushing through the next fade
|
50
|
+
if (command >= 60 && command < 63) { // brightness
|
51
|
+
switch (command - 60) { // align to ASCII "<"
|
52
|
+
case 0:
|
53
|
+
brightness = BRIGHTNESS_MIN;
|
54
|
+
break;
|
55
|
+
case 1:
|
56
|
+
brightness = BRIGHTNESS_MED;
|
57
|
+
break;
|
58
|
+
case 2:
|
59
|
+
brightness = BRIGHTNESS_MAX;
|
60
|
+
break;
|
61
|
+
}
|
62
|
+
|
63
|
+
FastLED.setBrightness(brightness);
|
64
|
+
command = prev_command;
|
65
|
+
} else if (command >= 65 && command < 89) { // color and pulse
|
66
|
+
// handled later at low point in fade for a nice smooth transition
|
67
|
+
} else { // invalid command
|
68
|
+
command = prev_command;
|
72
69
|
}
|
73
70
|
}
|
74
71
|
|
data/lib/blinkytape-orb.rb
CHANGED
@@ -46,7 +46,7 @@ class BlinkyTapeOrb
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
49
|
+
def setColorAndPulse(color, pulse)
|
50
50
|
if (color < 0 || color > 5)
|
51
51
|
raise ArgumentError, 'color must be between 0 and 5'
|
52
52
|
end
|
@@ -67,7 +67,7 @@ class BlinkyTapeOrb
|
|
67
67
|
|
68
68
|
logger.info("setting brightness=#{brightness}")
|
69
69
|
|
70
|
-
send(('
|
70
|
+
send(('<'.ord + brightness).chr)
|
71
71
|
end
|
72
72
|
|
73
73
|
private
|
@@ -44,7 +44,7 @@ describe BlinkyTapeOrb do
|
|
44
44
|
|
45
45
|
end
|
46
46
|
|
47
|
-
describe '#
|
47
|
+
describe '#setColorAndPulse' do
|
48
48
|
|
49
49
|
let (:color) { BlinkyTapeOrb::COLOR_RED }
|
50
50
|
let (:pulse) { BlinkyTapeOrb::PULSE_NONE }
|
@@ -54,7 +54,7 @@ describe BlinkyTapeOrb do
|
|
54
54
|
|
55
55
|
it 'raises ArgumentError' do
|
56
56
|
expect {
|
57
|
-
orb.
|
57
|
+
orb.setColorAndPulse(color, pulse)
|
58
58
|
}.to raise_error(ArgumentError)
|
59
59
|
end
|
60
60
|
end
|
@@ -64,33 +64,33 @@ describe BlinkyTapeOrb do
|
|
64
64
|
|
65
65
|
it 'raises ArgumentError' do
|
66
66
|
expect {
|
67
|
-
orb.
|
67
|
+
orb.setColorAndPulse(color, pulse)
|
68
68
|
}.to raise_error(ArgumentError)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
72
|
context 'with valid arguments' do
|
73
|
-
it 'sends correct
|
73
|
+
it 'sends correct command' do
|
74
74
|
expect(orb).to receive(:send).with('A')
|
75
|
-
orb.
|
75
|
+
orb.setColorAndPulse(color, pulse)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
context 'with purple color' do
|
80
80
|
let (:color) { BlinkyTapeOrb::COLOR_PURPLE }
|
81
81
|
|
82
|
-
it 'sends correct
|
82
|
+
it 'sends correct command' do
|
83
83
|
expect(orb).to receive(:send).with('U')
|
84
|
-
orb.
|
84
|
+
orb.setColorAndPulse(color, pulse)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
context 'with fast pulse' do
|
89
89
|
let (:pulse) { BlinkyTapeOrb::PULSE_FAST }
|
90
90
|
|
91
|
-
it 'sends correct
|
91
|
+
it 'sends correct command' do
|
92
92
|
expect(orb).to receive(:send).with('D')
|
93
|
-
orb.
|
93
|
+
orb.setColorAndPulse(color, pulse)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
@@ -111,8 +111,8 @@ describe BlinkyTapeOrb do
|
|
111
111
|
end
|
112
112
|
|
113
113
|
context 'with valid arguments' do
|
114
|
-
it 'sends correct
|
115
|
-
expect(orb).to receive(:send).with('
|
114
|
+
it 'sends correct command' do
|
115
|
+
expect(orb).to receive(:send).with('>')
|
116
116
|
orb.setBrightness(brightness)
|
117
117
|
end
|
118
118
|
end
|
@@ -120,8 +120,8 @@ describe BlinkyTapeOrb do
|
|
120
120
|
context 'with min brightness' do
|
121
121
|
let (:brightness) { BlinkyTapeOrb::BRIGHTNESS_MIN }
|
122
122
|
|
123
|
-
it 'sends correct
|
124
|
-
expect(orb).to receive(:send).with('
|
123
|
+
it 'sends correct command' do
|
124
|
+
expect(orb).to receive(:send).with('<')
|
125
125
|
orb.setBrightness(brightness)
|
126
126
|
end
|
127
127
|
end
|
@@ -137,7 +137,7 @@ describe BlinkyTapeOrb do
|
|
137
137
|
io = double('serial_port')
|
138
138
|
expect(io).to receive(:write).with('A')
|
139
139
|
expect(SerialPort).to receive(:open).and_yield(io)
|
140
|
-
orb.
|
140
|
+
orb.setColorAndPulse(BlinkyTapeOrb::COLOR_RED, BlinkyTapeOrb::PULSE_NONE)
|
141
141
|
end
|
142
142
|
|
143
143
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blinkytape-orb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Tai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: serialport
|