pixel_pi 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/LICENSE +21 -0
- data/Rakefile +4 -1
- data/examples/strandtest.rb +2 -2
- data/ext/pixel_pi/extconf.rb +31 -13
- data/lib/pixel_pi/fake_leds.rb +210 -0
- data/lib/pixel_pi/version.rb +1 -1
- data/lib/pixel_pi.rb +8 -1
- data/pixel_pi.gemspec +1 -1
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 688bc3e73f552b02b5dc0680b011b5bac6126e5b
|
4
|
+
data.tar.gz: 8834674338856c9c2cff5ade3a2e3bd965a861b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 376b26eee53fd8a891d3592e7cdfd07abb335a4280033a28a7f6ee485ee1934739a01fa5ec7432dec92ed34046b3a255cd56631497423a2ab7a8b6ee55629686
|
7
|
+
data.tar.gz: af41e39b37c563710b2d3066fb7673864d0c6bb0af707fb7a4a588335ef641a44bde725106150fca0774b7868873e94f475e354335383413442e2eb31521526e
|
data/.gitignore
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Tim Pease
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/Rakefile
CHANGED
@@ -6,7 +6,10 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
6
6
|
|
7
7
|
spec = Gem::Specification.load("pixel_pi.gemspec")
|
8
8
|
|
9
|
-
Gem::PackageTask.new(spec)
|
9
|
+
Gem::PackageTask.new(spec) do |pkg|
|
10
|
+
pkg.need_zip = false
|
11
|
+
pkg.need_tar = false
|
12
|
+
end
|
10
13
|
|
11
14
|
Rake::ExtensionTask.new("pixel_pi", spec) do |ext|
|
12
15
|
ext.name = "leds"
|
data/examples/strandtest.rb
CHANGED
@@ -145,7 +145,6 @@ module StrandTest
|
|
145
145
|
|
146
146
|
self
|
147
147
|
end
|
148
|
-
|
149
148
|
end
|
150
149
|
|
151
150
|
|
@@ -154,7 +153,8 @@ strip = PixelPi::Leds.new \
|
|
154
153
|
:frequency => LED_FREQ_HZ,
|
155
154
|
:dma => LED_DMA,
|
156
155
|
:brightness => LED_BRIGHTNESS,
|
157
|
-
:invert => LED_INVERT
|
156
|
+
:invert => LED_INVERT,
|
157
|
+
:debug => true
|
158
158
|
|
159
159
|
strip.extend StrandTest
|
160
160
|
|
data/ext/pixel_pi/extconf.rb
CHANGED
@@ -1,18 +1,36 @@
|
|
1
1
|
require 'mkmf'
|
2
|
+
require 'rbconfig'
|
2
3
|
|
3
4
|
pixel_pi_path = File.expand_path("../", __FILE__)
|
4
5
|
ws2811_path = File.expand_path("../../ws2811", __FILE__)
|
5
|
-
ws2811_files = %w[
|
6
|
-
clk.h
|
7
|
-
dma.h
|
8
|
-
gpio.h
|
9
|
-
pwm.h
|
10
|
-
ws2811.h
|
11
|
-
dma.c
|
12
|
-
pwm.c
|
13
|
-
ws2811.c
|
14
|
-
]
|
15
|
-
ws2811_files.map! { |name| "#{ws2811_path}/#{name}" }
|
16
|
-
FileUtils.cp(ws2811_files, pixel_pi_path)
|
17
6
|
|
18
|
-
|
7
|
+
if RbConfig::CONFIG["arch"].to_s =~ /\Aarm-linux/i
|
8
|
+
ws2811_files = %w[
|
9
|
+
clk.h
|
10
|
+
dma.h
|
11
|
+
gpio.h
|
12
|
+
pwm.h
|
13
|
+
ws2811.h
|
14
|
+
dma.c
|
15
|
+
pwm.c
|
16
|
+
ws2811.c
|
17
|
+
]
|
18
|
+
ws2811_files.map! { |name| "#{ws2811_path}/#{name}" }
|
19
|
+
FileUtils.cp(ws2811_files, pixel_pi_path)
|
20
|
+
|
21
|
+
create_makefile("pixel_pi/leds")
|
22
|
+
else
|
23
|
+
File.open("#{pixel_pi_path}/Makefile", "w") do |fd|
|
24
|
+
fd.write <<-MAKEFILE
|
25
|
+
all: ;
|
26
|
+
install: ;
|
27
|
+
static: ;
|
28
|
+
install-so: ;
|
29
|
+
install-rb: ;
|
30
|
+
clean: ;
|
31
|
+
clean-so: ;
|
32
|
+
clean-static: ;
|
33
|
+
clean-rb: ;
|
34
|
+
MAKEFILE
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
module PixelPi
|
4
|
+
|
5
|
+
# Given a set of RGB values return a single 24-bit color value. The RGB values
|
6
|
+
# are nubmers in the range 0..255.
|
7
|
+
#
|
8
|
+
# Returns a 24-bit RGB color value.
|
9
|
+
def self.Color( red, green, blue )
|
10
|
+
((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF)
|
11
|
+
end
|
12
|
+
|
13
|
+
# PixelPi::Error class
|
14
|
+
Error = StandardError.new
|
15
|
+
|
16
|
+
class Leds
|
17
|
+
extend Forwardable
|
18
|
+
|
19
|
+
# call-seq:
|
20
|
+
# PixelPi::Leds.new( length, gpio, options = {} )
|
21
|
+
#
|
22
|
+
# Create a new PixelPi::Leds instance that can be used to control a string of
|
23
|
+
# NeoPixels from a RaspberryPi. The length of the pixel string must be given as
|
24
|
+
# well as the GPIO pin number used to control the string. The remaining options
|
25
|
+
# have sensible defaults.
|
26
|
+
#
|
27
|
+
# length - the nubmer of leds in the string
|
28
|
+
# gpio - the GPIO pin number
|
29
|
+
# options - Hash of arguments
|
30
|
+
# :dma - DMA channel defaults to 5
|
31
|
+
# :frequency - output frequency defaults to 800,000 Hz
|
32
|
+
# :invert - defaults to `false`
|
33
|
+
# :brightness - defaults to 255
|
34
|
+
#
|
35
|
+
def initialize( length, gpio, options = {} )
|
36
|
+
@leds = [0] * length
|
37
|
+
@gpio = gpio
|
38
|
+
@dma = options.fetch(:dma, 5)
|
39
|
+
@frequency = options.fetch(:frequency, 800_000)
|
40
|
+
@invert = options.fetch(:invert, false)
|
41
|
+
@brightness = options.fetch(:brightness, 255)
|
42
|
+
@debug = options.fetch(:debug, false)
|
43
|
+
|
44
|
+
if @debug
|
45
|
+
require "rainbow"
|
46
|
+
@debug = "◉ " unless @debug.is_a?(String) && !@debug.empty?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
attr_reader :gpio, :dma, :frequency, :invert, :brightness
|
51
|
+
|
52
|
+
def_delegators :@leds, :length, :[]
|
53
|
+
|
54
|
+
# Set the pixel brightness. This is a value between 0 and 255. All pixels will
|
55
|
+
# be scaled by this value. The hue is not affected; only the luminosity is
|
56
|
+
# affected.
|
57
|
+
#
|
58
|
+
# Returns the new brightness.
|
59
|
+
def brightness=( value )
|
60
|
+
@brightness = Integer(value) & 0xFF;
|
61
|
+
end
|
62
|
+
|
63
|
+
# Update the display with the data from the LED buffer. This is a noop method
|
64
|
+
# for the fake LEDs.
|
65
|
+
def show
|
66
|
+
closed!
|
67
|
+
if @debug
|
68
|
+
ary = @leds.map { |value| Rainbow(@debug).color(*to_rgb(value)) }
|
69
|
+
$stdout.print "\r#{ary.join}"
|
70
|
+
end
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
# Clear the display. This will set all values in the LED buffer to zero, and
|
75
|
+
# then update the display. All pixels will be turned off by this method.
|
76
|
+
def clear
|
77
|
+
closed!
|
78
|
+
@leds.fill 0
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
# Shutdown the NeoPixels connected to the DMA / PWM channel. After this method
|
83
|
+
# the current PixelPi::Leds instance will no longer be usable; a new instance
|
84
|
+
# will need to be created. This method is automatically invoked when the
|
85
|
+
# instance is deallcoated by the Ruby garbage collector. It does not need to be
|
86
|
+
# explicitly invoked.
|
87
|
+
#
|
88
|
+
# Returns `nil`.
|
89
|
+
def close
|
90
|
+
$stdout.puts if @debug
|
91
|
+
@leds = nil
|
92
|
+
end
|
93
|
+
|
94
|
+
# Set the LED at position `num` to the provided 24-bit RGB color value.
|
95
|
+
#
|
96
|
+
# Returns the 24-bit RGB color value.
|
97
|
+
def []=( num, value )
|
98
|
+
closed!
|
99
|
+
if (num < 0 || num >= @leds.length)
|
100
|
+
raise IndexError, "index #{num} is outside of LED range: 0...#{@leds.length-1}"
|
101
|
+
end
|
102
|
+
@leds[num] = to_color(value)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Set the LED at position `num` to the given color. The color can be a single
|
106
|
+
# 24-bit RGB `color` value or three separate color values - one for `red`, one
|
107
|
+
# for `green`, and one for `blue`.
|
108
|
+
#
|
109
|
+
# Returns this PixelPi::Leds instance.
|
110
|
+
def set_pixel( num, *args )
|
111
|
+
self[num] = to_color(*args)
|
112
|
+
self
|
113
|
+
end
|
114
|
+
|
115
|
+
# Takes the current list of 24-bit RGB values stored in the LED strings and
|
116
|
+
# returns them as an Array. These colors might not be actively displayed; it
|
117
|
+
# all depends if `show` has been called on the PixelPi::Leds instance.
|
118
|
+
#
|
119
|
+
# Returns an Array of 24-bit RGB values.
|
120
|
+
def to_a
|
121
|
+
closed!
|
122
|
+
@leds.dup
|
123
|
+
end
|
124
|
+
|
125
|
+
# Replace the LED colors with the 24-bit RGB color values found in the `ary`.
|
126
|
+
# If the `ary` is longer than the LED string then the extra color values will
|
127
|
+
# be ignored. If the `ary` is shorter than the LED string then only the LEDS
|
128
|
+
# up to `ary.length` will be changed.
|
129
|
+
#
|
130
|
+
# You must call `show` for the new colors to be displayed.
|
131
|
+
#
|
132
|
+
# Returns this PixelPi::Leds instance.
|
133
|
+
def replace( ary )
|
134
|
+
closed!
|
135
|
+
@leds.length.times do |ii|
|
136
|
+
@leds[ii] = Integer(ary[ii])
|
137
|
+
end
|
138
|
+
self
|
139
|
+
end
|
140
|
+
|
141
|
+
# Reverse the order of the LED colors.
|
142
|
+
#
|
143
|
+
# Returns this PixelPi::Leds instance.
|
144
|
+
def reverse
|
145
|
+
closed!
|
146
|
+
@leds.reverse!
|
147
|
+
self
|
148
|
+
end
|
149
|
+
|
150
|
+
# Rotates the LED colors in place so that the color at `count` comes first. If
|
151
|
+
# `count` is negative then it rotates in the opposite direction, starting from
|
152
|
+
# the end of the LEDs where -1 is the last LED.
|
153
|
+
#
|
154
|
+
# Returns this PixelPi::Leds instance.
|
155
|
+
def rotate( *args )
|
156
|
+
closed!
|
157
|
+
@leds.rotate!(*args)
|
158
|
+
self
|
159
|
+
end
|
160
|
+
|
161
|
+
# Set the selected LEDs to the given `color`. The `color` msut be given as a
|
162
|
+
# 24-bit RGB value. You can also supply a block that receives an LED index and
|
163
|
+
# returns a 24-bit RGB color.
|
164
|
+
#
|
165
|
+
# Examples:
|
166
|
+
# leds.fill( 0x00FF00 )
|
167
|
+
# leds.fill( 0xFF0000, 2, 2 )
|
168
|
+
# leds.fill( 0x0000FF, (4...8) )
|
169
|
+
# leds.fill { |i| 256 << i }
|
170
|
+
#
|
171
|
+
# Returns this PixelPi::Leds instance.
|
172
|
+
def fill( *args )
|
173
|
+
closed!
|
174
|
+
if block_given?
|
175
|
+
@leds.fill do |ii|
|
176
|
+
value = yield(ii)
|
177
|
+
to_color(value)
|
178
|
+
end
|
179
|
+
else
|
180
|
+
value = to_color(args.shift)
|
181
|
+
@leds.fill(value, *args)
|
182
|
+
end
|
183
|
+
self
|
184
|
+
end
|
185
|
+
|
186
|
+
private
|
187
|
+
|
188
|
+
def to_color( *args )
|
189
|
+
case args.length
|
190
|
+
when 1; Integer(args.first) & 0xFFFFFF
|
191
|
+
when 3; PixelPi::Color(*args)
|
192
|
+
else
|
193
|
+
raise ArgumentError, "expecting either 1 or 3 arguments: #{args.length}"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def to_rgb( color )
|
198
|
+
scale = (brightness & 0xFF) + 1
|
199
|
+
[
|
200
|
+
(((color >> 16) & 0xFF) * scale) >> 8,
|
201
|
+
(((color >> 8) & 0xFF) * scale) >> 8,
|
202
|
+
(( color & 0xFF) * scale) >> 8
|
203
|
+
]
|
204
|
+
end
|
205
|
+
|
206
|
+
def closed!
|
207
|
+
raise(::PixelPi::Error, "Leds are not initialized") if @leds.nil?
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
data/lib/pixel_pi/version.rb
CHANGED
data/lib/pixel_pi.rb
CHANGED
data/pixel_pi.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pixel_pi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Pease
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rainbow
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
27
41
|
description: NeoPixels are fun! Ruby is fun! RaspberryPi is fun! FUN^3
|
28
42
|
email:
|
29
43
|
- tim.pease@gmail.com
|
@@ -33,6 +47,7 @@ extensions:
|
|
33
47
|
extra_rdoc_files: []
|
34
48
|
files:
|
35
49
|
- ".gitignore"
|
50
|
+
- LICENSE
|
36
51
|
- README.md
|
37
52
|
- Rakefile
|
38
53
|
- examples/strandtest.rb
|
@@ -48,6 +63,7 @@ files:
|
|
48
63
|
- ext/ws2811/ws2811.c
|
49
64
|
- ext/ws2811/ws2811.h
|
50
65
|
- lib/pixel_pi.rb
|
66
|
+
- lib/pixel_pi/fake_leds.rb
|
51
67
|
- lib/pixel_pi/version.rb
|
52
68
|
- pixel_pi.gemspec
|
53
69
|
homepage: https://github.com/TwP/pixel_pi
|
@@ -70,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
86
|
version: '0'
|
71
87
|
requirements: []
|
72
88
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.2.
|
89
|
+
rubygems_version: 2.2.3
|
74
90
|
signing_key:
|
75
91
|
specification_version: 4
|
76
92
|
summary: A library for controlling NeoPixels via Ruby on the RaspberryPi
|