Ifos Hardware Check
Here's a short video of Ifos running a hardware check. The LEDs are intensely bright, so it probably would have been better not to shoot them straight-on, but the basic operation is still obvious.
Here’s the code used to generate the test patterns:
#!/usr/bin/ruby
## ---------------------------------------------------------------------------
##
## Ifos
##
## Copyright © 2006-8 Peter Heinrich
## All Rights Reserved
##
## $URL: svn://saphum.com/PIC/ifos/trunk/test.rb $
## $Revision: 371 $
##
## ---------------------------------------------------------------------------
## $Author: Peter $
## $Date: 2008-10-12 21:47:56 +0000 (Sun, 12 Oct 2008) $
## ---------------------------------------------------------------------------
require "modbus.rb"
# Create a Modbus connection on COM port 4 (ASCII mode, for testing)
@mb = Modbus.new 3, false
# Use the Modbus Write Registers command to blast a bunch of values
# to device 4 (the device under test).
def on( index, values )
values = [values] unless values.kind_of? Array
@mb.writeRegisters 4, index, values
end
# Turn off one or more LEDs by writing 0 to them.
def off( index, length = 1 )
values = Array.new( length, 0 )
on index, values
end
# Light one component of all RGB LEDs simultaneously,
# progressing sequentially through all possible intensities.
def test_rgb_leds( shift )
(0..16).each do |s|
# These LEDs take a 1-5-5-5 RGB color, so the shift selects
# which color component receives the intensity value.
values = Array.new( 8, s << shift )
on 0, values
end
# Turn off all the RGB LEDs.
(0..7).each do |i|
off i
end
end
# Light all of the white LEDs simultaneously at each of the
# possible intensities.
def test_white_leds
(0..16).each do |s|
values = Array.new( 16, s )
on 8, values
end
# Turn off all the white LEDs.
(8..23).each do |i|
off i
end
end
# The RGB LEDs can be controlled with a single register (0-7),
# but each component may also be accessed individually at a
# register "alias" (24-47).
def test_virtual_leds
(24..47).each do |i|
on i, 8
end
(24..47).each do |i|
off i
end
end
# Bring up a color wash between two primary components.
def test_color_fade( start_shift, end_shift )
# Fade up the color wash over all intensities.
(0..16).each do |s|
values = Array.new( 8, 0 )
(0..7).each do |i|
values[ i ] = ((i * s / 7) << end_shift) + (((7 - i) * s / 7) << start_shift)
end
on 0, values
end
# Fade down the color wash.
(0..16).each do |s|
values = Array.new( 8, 0 )
(0..7).each do |i|
values[ i ] = ((i * (16 - s) / 7) << end_shift) + (((7 - i) * (16 - s) / 7) << start_shift)
end
on 0, values
end
end
# Randomly light a selection of single LEDs, then do the same
# in combinations of 2, 3, 4, etc., up to 8 simultaneously.
def test_random( first, count )
(1..8).each do |s|
16.times do
values = Array.new( count, 0 )
s.times { |c| values[ rand( count ) ] = 1 + rand( 16 ) }
on first, count
off first, count
end
end
end
# Randomly light the white LEDs only.
def test_random_white
test_random( 8, 16 )
end
# Randomly light the individual RGB components only.
def test_random_virtual
test_random( 24, 24 )
end
# Randomly light any white or individual RGB component LEDs.
def test_random_all
test_random( 8, 40 )
end
# Execute the tests.
test_rgb_leds 0 # red
test_rgb_leds 5 # green
test_rgb_leds 10 # blue
test_white_leds
test_virtual_leds
test_color_fade 0, 5 # red -> green
test_color_fade 5, 0 # green -> red
test_color_fade 5, 10 # green -> blue
test_color_fade 10, 5 # blue -> green
test_color_fade 10, 0 # blue -> red
test_color_fade 0, 10 # red -> blue
test_random_white
test_random_virtual
test_random_all