littlewire 0.9.7 → 0.9.8
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 +4 -4
- data/bin/littlewire.rb +79 -0
- data/examples/i2c/microchip-eeprom.rb +33 -0
- data/examples/i2c/nunchuck.rb +80 -0
- data/examples/i2c/search.rb +5 -0
- data/examples/ws2811/all.rb +44 -0
- data/examples/ws2811/colors.rb +28 -0
- data/examples/ws2811/manual.rb +43 -0
- data/examples/ws2811/scan.rb +26 -0
- data/examples/ws2811/spin.rb +17 -0
- data/examples/ws2811/strobe.rb +93 -0
- data/firmware/1.0.hex +254 -0
- data/firmware/1.1.hex +356 -0
- data/firmware/1.2.hex +364 -0
- data/firmware/cdc232.hex +173 -0
- data/firmware/latest-beta.hex +377 -0
- data/firmware/latest.hex +364 -0
- data/lib/littlewire.rb +16 -14
- data/lib/{analog.rb → littlewire/analog.rb} +0 -0
- data/lib/{digital.rb → littlewire/digital.rb} +1 -1
- data/lib/littlewire/gadgets/micronucleus.rb +171 -0
- data/lib/littlewire/gadgets/nunchuck.rb +102 -0
- data/lib/{hardware-pwm.rb → littlewire/hardware-pwm.rb} +0 -0
- data/lib/littlewire/i2c.rb +92 -0
- data/lib/{one-wire.rb → littlewire/one-wire.rb} +0 -0
- data/lib/{servo.rb → littlewire/servo.rb} +0 -0
- data/lib/{software-pwm.rb → littlewire/software-pwm.rb} +0 -0
- data/lib/{spi.rb → littlewire/spi.rb} +0 -0
- data/lib/littlewire/version.rb +8 -0
- data/lib/{ws2811.rb → littlewire/ws2811.rb} +7 -5
- metadata +40 -16
- data/examples/led pixel.rb +0 -55
- data/lib/i2c.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ce81eaa4836881938aeca5d6d4300f49f90fcef
|
4
|
+
data.tar.gz: f8b8ba8827f9b23abfe77339b4684bc250bb04ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ec2ac2d655f97325571c7ff1f4605a5c3ba0e1f451c4e92ae408f8863b55f26d919cb71d4d2181081caa06f3ec6ced62cefc844ff9317031cc2da76c5733f6b
|
7
|
+
data.tar.gz: 1290c8bd90d384ebcf25d3f7dd535d04609e70826566bc5327b2f4ce04a18a2d938170a97cb5f2839852f8a432d6de687f3a38b33709aaac942186035ad372a0
|
data/bin/littlewire.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
__dir__ ||= File.dirname(__FILE__)
|
3
|
+
#$:.unshift File.join(__dir__, '..', 'lib')
|
4
|
+
require 'thor'
|
5
|
+
require 'pp'
|
6
|
+
require 'littlewire'
|
7
|
+
require 'littlewire/gadgets/micronucleus'
|
8
|
+
|
9
|
+
class LittleWireUtility < Thor
|
10
|
+
desc "install [version]", "Install a specific firmware on to the littlewire device"
|
11
|
+
def install version = 'latest'
|
12
|
+
path = File.join(__dir__, "..", "firmware", "#{version}.hex")
|
13
|
+
raise "Unknown Version" unless File.file? path
|
14
|
+
|
15
|
+
data = HexProgram.new(open path).binary
|
16
|
+
|
17
|
+
retried = false
|
18
|
+
begin
|
19
|
+
puts "Will upload to a littlewire which has been updated with the micronucleus bootloader, or to a digispark."
|
20
|
+
puts "Plug in micronucleus device now: (waiting)"
|
21
|
+
sleep 0.25 while Micronucleus.all.length == 0
|
22
|
+
|
23
|
+
nucleus = Micronucleus.all.first
|
24
|
+
puts "Attached to device: #{nucleus.inspect}"
|
25
|
+
|
26
|
+
sleep(0.25) # some time to think?
|
27
|
+
puts "Writing program in to device's memory"
|
28
|
+
nucleus.program = data
|
29
|
+
|
30
|
+
puts "Great! Starting new littlewire firmware..."
|
31
|
+
nucleus.finished # let thinklet know it can go do other things now if it likes
|
32
|
+
rescue LIBUSB::ERROR_IO => err
|
33
|
+
unless retried
|
34
|
+
retried = true
|
35
|
+
retry
|
36
|
+
end
|
37
|
+
raise err
|
38
|
+
end
|
39
|
+
|
40
|
+
puts "All done!"
|
41
|
+
puts "If littlewire doesn't automatically appear in a few seconds, unplug and replug device from USB port"
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "firmwares", "List all versions which can be installed via install command"
|
45
|
+
def firmwares
|
46
|
+
puts "Available LittleWire Firmware:"
|
47
|
+
Dir[File.join(__dir__, "..", "firmware", "*.hex")].each do |filename|
|
48
|
+
puts File.basename(filename, '.hex')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "version", "Which version of the ruby library is this?"
|
53
|
+
def version
|
54
|
+
puts "Library Version: #{LittleWire.version}"
|
55
|
+
|
56
|
+
wire = LittleWire.connect
|
57
|
+
puts "Device Firmware: #{wire.version}" if wire
|
58
|
+
|
59
|
+
latest_path = File.join(__dir__, "..", "firmware", "#{LittleWire::SupportedVersions.first}.hex")
|
60
|
+
if LittleWire::SupportedVersions.index(wire.version) != 0 and File.exists? latest_path
|
61
|
+
puts "An updated firmware is available, version #{LittleWire::SupportedVersions.first}"
|
62
|
+
puts "To update, run:"
|
63
|
+
puts " littlewire.rb install #{LittleWire::SupportedVersions.first}"
|
64
|
+
puts ""
|
65
|
+
puts "If you bought your LittleWire as a kit from Seeed Studios, you may need to first"
|
66
|
+
puts "install the Micronucleus bootloader as described on the littlewire.cc website."
|
67
|
+
puts ""
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
desc "racer", "Attach a Wii Nunchuck and play a game"
|
72
|
+
def racer
|
73
|
+
ruby_vm = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
74
|
+
system(ruby_vm, File.join(__dir__, '..', 'examples', 'i2c', 'nunchuck.rb'))
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
LittleWireUtility.start(ARGV)
|
79
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'littlewire'
|
2
|
+
|
3
|
+
# Make a class which represents a digispark with the digistump eeprom shield attached
|
4
|
+
# with LittleWire installed
|
5
|
+
class MicrochipEEPROM
|
6
|
+
def initialize wire = LittleWire.connect, address = 0x50
|
7
|
+
raise "EEPROM device not responding" unless wire.i2c.address_responds? address
|
8
|
+
|
9
|
+
@wire = wire
|
10
|
+
@device = address
|
11
|
+
|
12
|
+
@wire.i2c.delay = 10
|
13
|
+
end
|
14
|
+
|
15
|
+
def read address
|
16
|
+
@wire.i2c.transmit @device, [(address >> 8) & 0xFF, address & 0xFF]
|
17
|
+
@wire.i2c.request(@device, 1)
|
18
|
+
end
|
19
|
+
|
20
|
+
def write address, data
|
21
|
+
@wire.i2c.transmit @device, [address >> 8, address & 0xFF, data]
|
22
|
+
sleep 0.01 # time to write data
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
eep = MicrochipEEPROM.new
|
27
|
+
|
28
|
+
number = rand(127)
|
29
|
+
puts "Random number is #{number}"
|
30
|
+
puts "Writing to eeprom at address 0"
|
31
|
+
eep.write 0, number
|
32
|
+
puts "Reading back..."
|
33
|
+
puts eep.read(0)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# This little example shows the nunchuck gadget extension
|
2
|
+
# The Nunchuck gadget lets you easily connect with Nintendo Wii-compatible
|
3
|
+
# 'Nunchuck' devices using the I2C feature of the LittleWire device.
|
4
|
+
require 'littlewire'
|
5
|
+
require 'littlewire/gadgets/nunchuck'
|
6
|
+
|
7
|
+
wire = LittleWire.connect
|
8
|
+
wire.pin_mode :ds5, :output
|
9
|
+
wire.digital_write :ds5, :low
|
10
|
+
|
11
|
+
car = 0.0
|
12
|
+
wall = 0.0
|
13
|
+
wall_width = 16
|
14
|
+
constraint = 20.0
|
15
|
+
|
16
|
+
puts DATA.read
|
17
|
+
puts ''
|
18
|
+
puts "Point your nunchuck at the screen, and press C button to start your engines!"
|
19
|
+
sleep 0.1 until wire.nunchuck.sample.buttons.c
|
20
|
+
|
21
|
+
seconds = 0.0
|
22
|
+
seconds_since_gearshift = 0.0
|
23
|
+
last_full_second = 0
|
24
|
+
step = 0.1
|
25
|
+
|
26
|
+
GearshiftInterval = 10.0
|
27
|
+
|
28
|
+
loop do
|
29
|
+
controller = wire.nunchuck.sample
|
30
|
+
car += controller.accelerometer.x * 2.0
|
31
|
+
|
32
|
+
wall += rand(3) - 1
|
33
|
+
wall = -20.0 if wall < -constraint
|
34
|
+
wall = +20.0 if wall > +constraint
|
35
|
+
|
36
|
+
real_wall = wall + constraint * 2 + 1
|
37
|
+
real_car = car + constraint * 2 + 1
|
38
|
+
|
39
|
+
string = " " * 80
|
40
|
+
string[real_wall - wall_width / 2] = '|'
|
41
|
+
string[real_wall + wall_width / 2] = '|'
|
42
|
+
string[real_car] = '5'
|
43
|
+
|
44
|
+
if seconds > last_full_second + 5
|
45
|
+
string[0...10] = seconds.round.to_s.ljust(10, ' ')
|
46
|
+
last_full_second = seconds.round
|
47
|
+
end
|
48
|
+
puts string
|
49
|
+
|
50
|
+
raise "Crashed your car!" if real_car < real_wall - (wall_width / 2)
|
51
|
+
raise "Crashed your car!" if real_car > real_wall + (wall_width / 2)
|
52
|
+
|
53
|
+
sleep step
|
54
|
+
seconds += step
|
55
|
+
seconds_since_gearshift += step
|
56
|
+
if seconds_since_gearshift > GearshiftInterval
|
57
|
+
step *= 0.8
|
58
|
+
seconds_since_gearshift = 0.0
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
__END__
|
63
|
+
______ __ __ ____ ____ ____
|
64
|
+
/_ __/ / / / / / __ \ / __ ) / __ \
|
65
|
+
/ / / / / / / /_/ / / __ | / / / /
|
66
|
+
/ / / /_/ / / _, _/ / /_/ / / /_/ /
|
67
|
+
/_/ \____/ /_/ |_| /_____/ \____/
|
68
|
+
____ ___ ______ ______ ____
|
69
|
+
/ __ \ / | / ____/ / ____/ / __ \
|
70
|
+
/ /_/ / / /| | / / / __/ / /_/ /
|
71
|
+
/ _, _/ / ___ | / /___ / /___ / _, _/
|
72
|
+
/_/ |_| /_/ |_| \____/ /_____/ /_/ |_|
|
73
|
+
______ _ __ ______ ____ ______ __ ___ ______
|
74
|
+
/ ____/ | |/ / /_ __/ / __ \ / ____/ / |/ / / ____/
|
75
|
+
/ __/ | / / / / /_/ / / __/ / /|_/ / / __/
|
76
|
+
/ /___ / | / / / _, _/ / /___ / / / / / /___
|
77
|
+
/_____/ /_/|_| /_/ /_/ |_| /_____/ /_/ /_/ /_____/
|
78
|
+
|
79
|
+
Motion Nunchuck Ninja Edition 2.1 - Insert Coin
|
80
|
+
Published by Mechanum Industries for PC-DOS, Amega, VIC 20, and iPhone 5c
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Send up to 64 colours to a string of WS2812 LEDs or 800khz (version 2) Adafruit Flora NeoPixels
|
2
|
+
# Any 800khz mode ws2811 pixels will work
|
3
|
+
require 'littlewire'
|
4
|
+
wire = LittleWire.connect
|
5
|
+
|
6
|
+
if wire == nil
|
7
|
+
puts "Couldn't find an attached LittleWire device"
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
|
11
|
+
if ARGV.length != 2
|
12
|
+
puts DATA.read # print out the little ascii art help
|
13
|
+
exit
|
14
|
+
end
|
15
|
+
|
16
|
+
pin = ARGV[0].gsub(/[^0-9a-zA-Z]/, '').downcase
|
17
|
+
color = ARGV[1]
|
18
|
+
|
19
|
+
puts "Setting 64 pixels connected to #{pin} to be #{color}"
|
20
|
+
wire.ws2811(pin).send([color] * 64)
|
21
|
+
|
22
|
+
puts "All done!"
|
23
|
+
|
24
|
+
__END__
|
25
|
+
|
26
|
+
all.rb sets 64 pixels connected to a littlewire (or digispark) pin to
|
27
|
+
a specific colour. You can specify this colour by CSS name 'red'
|
28
|
+
or by web-style hex code '#ff0000', or with CSS-style RGB constructs
|
29
|
+
'(rgb(255, 0, 0)'. Run all.rb with two arguments - the output pin name
|
30
|
+
followed by the colour.
|
31
|
+
|
32
|
+
LittleWire connector: | Digispark Board:
|
33
|
+
/-----\ | _________
|
34
|
+
pin1 | o o | vcc | _____| o| ds5
|
35
|
+
pin2 | o o | pin4 | |----- o| (usb - not available)
|
36
|
+
pin3 | o o | gnd | |----- o| (usb - not available)
|
37
|
+
\-----/ | |----- o| ds2
|
38
|
+
|----- o| ds1
|
39
|
+
|_o_o_o__o| ds0
|
40
|
+
5 g v
|
41
|
+
v n c
|
42
|
+
d c
|
43
|
+
|
44
|
+
Example: ruby all.rb pin4 aqua
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'littlewire'
|
2
|
+
wire = LittleWire.connect
|
3
|
+
pin = :pin4
|
4
|
+
speed = 1
|
5
|
+
num_leds = 64
|
6
|
+
|
7
|
+
hue = 0.0
|
8
|
+
|
9
|
+
loop do
|
10
|
+
puts "red"
|
11
|
+
wire.ws2811(pin).send(['red'] * num_leds)
|
12
|
+
sleep speed
|
13
|
+
|
14
|
+
puts "green"
|
15
|
+
wire.ws2811(pin).send(['green'] * num_leds)
|
16
|
+
sleep speed
|
17
|
+
|
18
|
+
puts "blue"
|
19
|
+
wire.ws2811(pin).send(['blue'] * num_leds)
|
20
|
+
sleep speed
|
21
|
+
# red = 1.0 + (Math.sin(hue) * 127)
|
22
|
+
# green = 1.0 + (Math.sin(hue + ((Math::PI*2.0) / 3)) * 127)
|
23
|
+
# blue = 1.0 + (Math.sin(hue - ((Math::PI*2.0) / 3)) * 127)
|
24
|
+
#
|
25
|
+
# wire.ws2811(pin).send([Colorist::Color.from_rgb(red, green, blue)] * num_leds)
|
26
|
+
#
|
27
|
+
# hue += 0.5
|
28
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Send up to 64 colours to a string of WS2812 LEDs or 800khz (version 2) Adafruit Flora NeoPixels
|
2
|
+
# Any 800khz mode ws2811 pixels will work
|
3
|
+
require 'littlewire'
|
4
|
+
wire = LittleWire.connect
|
5
|
+
|
6
|
+
puts DATA.read # print out the little ascii art thing at the end of this file
|
7
|
+
puts "Which pin to use for data output?"
|
8
|
+
print "Enter pin number: "
|
9
|
+
output_pin = gets.gsub(/[^0-9a-zA-Z]/, '').downcase
|
10
|
+
|
11
|
+
puts "Blacking out strip"
|
12
|
+
wire.ws2811(output_pin).black!
|
13
|
+
|
14
|
+
colors = []
|
15
|
+
|
16
|
+
# print "Enter 1st color: "
|
17
|
+
# wire.ws2811.colors = [gets.strip.to_color]
|
18
|
+
# wire.ws2811.output(output_pin) # output our first color
|
19
|
+
|
20
|
+
titles = ['1st', '2nd', '3rd']
|
21
|
+
|
22
|
+
63.times do |idx|
|
23
|
+
print "Enter #{titles[idx] || "#{idx + 1}th"} color: "
|
24
|
+
gotten = gets.strip
|
25
|
+
break if gotten.empty?
|
26
|
+
colors << gotten.to_color
|
27
|
+
wire.ws2811(output_pin).send colors
|
28
|
+
end
|
29
|
+
|
30
|
+
puts "All done!"
|
31
|
+
|
32
|
+
__END__
|
33
|
+
LittleWire connector: | Digispark Board:
|
34
|
+
/-----\ | _________
|
35
|
+
pin1 | o o | vcc | _____| o| ds5
|
36
|
+
pin2 | o o | pin4 | |----- o| (usb - not available)
|
37
|
+
pin3 | o o | gnd | |----- o| (usb - not available)
|
38
|
+
\-----/ | |----- o| ds2
|
39
|
+
|----- o| ds1
|
40
|
+
|_o_o_o__o| ds0
|
41
|
+
5 g v
|
42
|
+
v n c
|
43
|
+
d c
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'littlewire'
|
2
|
+
wire = LittleWire.connect
|
3
|
+
num_pixels = ARGV.first.to_i
|
4
|
+
pin = :pin4
|
5
|
+
|
6
|
+
lit = 0
|
7
|
+
loop do
|
8
|
+
|
9
|
+
text_output = ['-'] * num_pixels
|
10
|
+
text_output[lit] = '*'
|
11
|
+
puts text_output.join
|
12
|
+
|
13
|
+
wire.ws2811(pin).send num_pixels.times.map { |idx|
|
14
|
+
if idx == lit
|
15
|
+
'white'.to_color
|
16
|
+
else
|
17
|
+
'black'.to_color
|
18
|
+
end
|
19
|
+
}
|
20
|
+
|
21
|
+
lit += 1
|
22
|
+
lit %= num_pixels
|
23
|
+
|
24
|
+
sleep 0.005
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'littlewire'
|
2
|
+
include Colorist
|
3
|
+
wire = LittleWire.connect
|
4
|
+
num_pixels = ARGV.first.to_i
|
5
|
+
|
6
|
+
loop do
|
7
|
+
position = (Time.now.to_f / 60) % 1
|
8
|
+
wire.ws2811.colors = num_pixels.times.map do |idx|
|
9
|
+
brightness = Math.sin((position - (idx.to_f / num_pixels)) * Math::PI * 2) * 255
|
10
|
+
Color.from_rgb(0, brightness.to_i, 0)
|
11
|
+
end
|
12
|
+
|
13
|
+
wire.ws2811.output :pin4
|
14
|
+
|
15
|
+
sleep 1.0 / 60.0
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'littlewire'
|
2
|
+
wire = LittleWire.connect
|
3
|
+
pin = :pin4
|
4
|
+
num_leds = 19
|
5
|
+
MaxBPM = 500
|
6
|
+
AveragedTaps = 8
|
7
|
+
|
8
|
+
puts "Outputtting data to LittleWire pin named '#{pin}'"
|
9
|
+
|
10
|
+
strobe_duration = 0.01
|
11
|
+
bpm = 30
|
12
|
+
last_tap = Time.now.to_f
|
13
|
+
tap_bpms = []
|
14
|
+
last_strobe = Time.now.to_f
|
15
|
+
reset = false
|
16
|
+
|
17
|
+
wire.ws2811(pin).black!
|
18
|
+
|
19
|
+
puts "Enter BPM and press enter to set it"
|
20
|
+
puts "Or, tap enter key (leave blank) to the beat to detect BPM"
|
21
|
+
puts "Or, enter z to halve current bpm and x to double it, followed by enter"
|
22
|
+
|
23
|
+
Thread.abort_on_exception = true
|
24
|
+
interface = Thread.start do
|
25
|
+
loop do
|
26
|
+
print "Enter BPM: "
|
27
|
+
str = $stdin.gets.strip
|
28
|
+
time = Time.now.to_f
|
29
|
+
new_bpm = bpm
|
30
|
+
|
31
|
+
if str == 'z'
|
32
|
+
new_bpm = bpm / 2.0
|
33
|
+
tap_bpms.map! { |x| x / 2.0 }
|
34
|
+
|
35
|
+
elsif str == 'x'
|
36
|
+
new_bpm = bpm * 2.0
|
37
|
+
tap_bpms.map! { |x| x * 2 }
|
38
|
+
|
39
|
+
elsif str.empty?
|
40
|
+
# calculate bpm from last tap and this one
|
41
|
+
tap_bpm = 60.0 / (time - last_tap)
|
42
|
+
|
43
|
+
# add tap to list and compute average
|
44
|
+
tap_bpms.push tap_bpm
|
45
|
+
tap_bpms = tap_bpms.last(AveragedTaps)
|
46
|
+
|
47
|
+
# compute average
|
48
|
+
avg = tap_bpms.reduce(:+) / tap_bpms.length
|
49
|
+
nearest_subset = tap_bpms.sort { |a,b| (a - avg).abs <=> (b - avg).abs }.first(tap_bpms.length / 2)
|
50
|
+
|
51
|
+
new_bpm = nearest_subset.reduce(:+) / nearest_subset.length if nearest_subset.length >= 2
|
52
|
+
|
53
|
+
# because strobes are mainly used with electro music, and electro music is
|
54
|
+
# usually whole number BPMs, round it to the nearest full bpm
|
55
|
+
new_bpm = new_bpm.round
|
56
|
+
|
57
|
+
# set last strobe and last tap to now, so a new strobe begins immediately
|
58
|
+
last_strobe = last_tap = time
|
59
|
+
reset = true # ask main thread to skip timers and start a new strobe now
|
60
|
+
|
61
|
+
puts "TAP!"
|
62
|
+
else # numbers were typed in presumably!
|
63
|
+
new_bpm = (str.to_f rescue bpm)
|
64
|
+
tap_bpms.clear # reset tap bpm system
|
65
|
+
end
|
66
|
+
|
67
|
+
new_bpm = MaxBPM if new_bpm > MaxBPM
|
68
|
+
new_bpm = 30.0 if new_bpm < 30.0
|
69
|
+
bpm = new_bpm
|
70
|
+
puts "Set to #{bpm}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
loop do
|
75
|
+
last_strobe = Time.now.to_f
|
76
|
+
wire.ws2811(pin).set ['white'] * num_leds
|
77
|
+
|
78
|
+
while Time.now.to_f - last_strobe <= strobe_duration and !reset
|
79
|
+
Thread.pass
|
80
|
+
end
|
81
|
+
|
82
|
+
wire.ws2811(pin).set ['black'] * num_leds
|
83
|
+
blackout_duration = (60.0 / bpm) - strobe_duration
|
84
|
+
|
85
|
+
while Time.now.to_f - last_strobe <= 60.0 / bpm and !reset
|
86
|
+
Thread.pass
|
87
|
+
end
|
88
|
+
|
89
|
+
last_strobe += 60.0 / bpm
|
90
|
+
|
91
|
+
#sleep((60.0 / bpm) - strobe_duration) if blackout_duration > 0
|
92
|
+
reset = false
|
93
|
+
end
|