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