switchy 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2008-2009 David Brady github@shinybit.com
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,150 @@
1
+ = Switchy
2
+
3
+ Ruby Application to switch AC loads (e.g. turn a lamp on and off).
4
+
5
+ Update 2009-09-26: This has actually become something of a
6
+ unit-testing light dongle for me. The basic switching hardware was
7
+ finished quite early, so the only thing left to do was to add a Killer
8
+ Demo App(TM). The basic switching app is just called "switchy", and it
9
+ controls individual pins 1 through 10 on the board.
10
+
11
+ The Killer Demo, then, would be Sparky, Sparcumber, and Autospark.
12
+ Each of these has a "christmas tree" LED arrangement: Five LEDs on
13
+ each side of the device are wired for run, fail, warning, and pass.
14
+ There are two green LEDs for pass on each side, so the pinouts are:
15
+
16
+ Pins 1-5 (left side): blue, red, yellow, green, green
17
+ Pins 10-6 (right side, note reverse order because pin numbering continues
18
+ clockwise around the board): blue, red, yellow, green, green
19
+
20
+ Sparky provides an RSpec progress formatter, so that it gets updated
21
+ as each spec runs. While running it animates the LEDs to show the
22
+ current overall progress. As each spec finishes an LED of the
23
+ appropriate color lights up.
24
+
25
+ Sparky also has a generic mode. If you run "sparky foo", sparky will
26
+ turn on the running lights, then run the foo command. When foo
27
+ finishes, its exit status will be used to turn on either the red or
28
+ green lights.
29
+
30
+ Sparcumber does for Cucumber what Sparky does for RSpec. Get Cucumber
31
+ configured so you can type "cucumber" from the root of your project,
32
+ then type "sparcumber" instead. Sparcumber will light up the board as
33
+ Cucumber runs.
34
+
35
+ Autospark is currently vaporware. All it should do is hook sparky into
36
+ autospec. Patches are welcome. There is a spec.sparky.opts file in the
37
+ res folder, however, that will achieve this for now, but it does cause
38
+ your project to take a dependency on sparky, which in turn requires
39
+ having the hardware dongle connected to run your specs, which is less
40
+ than agile.
41
+
42
+
43
+ = Example
44
+
45
+ == Command-line Apps
46
+
47
+ === Switchy
48
+
49
+ Switchy gives you control of each light individually.
50
+
51
+ $ switchy 1 1 2 0 10 1 8 1
52
+ # => Lights 1, 8, 10 turn on; light 2 turns off
53
+
54
+ DANGER: This is wildly incompatible with the original design of
55
+ switchy. The original design is intended to drive a single external
56
+ device from a single pin through a relay.
57
+
58
+ The prototype design, however, ended up getting optimizing for low
59
+ part count, and in fact I just soldered LEDs directly to the logic
60
+ board (and there ARE no other parts). This means that each LED is
61
+ soldered across TWO pins.
62
+
63
+ Turning on light 1, for instance, involves driving pin C4 high and
64
+ driving pin C5 low.
65
+
66
+ Remember that when discussing lights, we turn them on or off, but when
67
+ discussing the logic pins we drive them high or low, because when you
68
+ drive a pin low you are actually establishing a connection between
69
+ that pin and ground, allowing current to "sink".
70
+
71
+ === Sparky
72
+
73
+ A wrapper on top of switchy that gives you pass/pending/fail
74
+ semantics.
75
+
76
+ $ sparky (run|pass|pending|fail)
77
+ # => turns on running|green|yellow|red lights
78
+
79
+ $ sparky <system command> [<command options>]
80
+
81
+ # => Turns on run lights and executise shell command. If the exit
82
+ # code is 0, turns green. Any other exit code and it turns red.
83
+
84
+ === Sparcumber
85
+
86
+ Sparcumber is a cucumber wrapper. It hooks into Cucumber's
87
+ AST::Visitor class. Use it like you would use Cucumber:
88
+
89
+ $ sparcumber -r features features/
90
+
91
+ One additional bit of cleverness: While running, each step that
92
+ passes/pends/fails will turn on ONE light of the appropriate color. If
93
+ another step exits in the same condition, that color light will
94
+ advance (E.g. the currently lit green light will go out and the next
95
+ one will turn on). This provides the visual effect of animating the
96
+ feature output. Note that it is thus possible to 5 leds lit at once:
97
+ the 2 running lights plus one each of red, yellow and green.
98
+
99
+ == Ruby Library
100
+
101
+ TODO: The ruby lib is pretty messed up. Here's what currently works:
102
+
103
+ s = Switchy.new
104
+ s.set_pin Switchy::PINS::D6, 0
105
+ # Drives pin D6 low (which turns on the on-board LED)
106
+ s.set_pin Switchy::PINS::B3, 1
107
+ # Drives pin B3 high
108
+
109
+ = The Hardware
110
+
111
+ ...is currently very much in flux.
112
+
113
+ TODO: Write me!
114
+
115
+ = TODO
116
+
117
+ - There's an enable line on the 74ls244 driver chip. Use it. Device
118
+ should boot disabled. Once everything's had a chance to settle
119
+ (10-100ms or so), enable the driver chip.
120
+
121
+ - Add circuit schematics to the project.
122
+
123
+ - [DONE] Fork the circuit, make a version with just a little LED light
124
+ bar and no 120VAC switching. (Trust me. The little LEDs are VERY
125
+ compelling!)
126
+
127
+ - [ABANDONED] Add duty cycling/blinking to the board. (Tabled for now.
128
+ The USB serial port driver that comes with the Teensy board appears
129
+ to use blocking methods. The code libraries are poorly documented
130
+ and will require a significantly higher amount of expertise with AVR
131
+ programming than I currently have before I can port it to a
132
+ non-blocking form.)
133
+
134
+ - Write a simulator for the 6.3E+06-1 people on the planet who do not
135
+ have the only existing prototype. I think a little MacRuby
136
+ Red/Green/Refactor applet would be spiffy all by itself--and would
137
+ make debugging/testing driver and linking apps much easier.
138
+
139
+ - [DONE] 2009-04-20: Review previous TODOs in light of first finished
140
+ prototype.
141
+
142
+ - [DONE] Change progress formatter lights, and light up only one
143
+ pass/fail/pending LED as specs run. As each example completes,
144
+ animate the display by moving the the one led to another spot. So if
145
+ all your specs are passing, you'll see the green light move 1 -> 2
146
+ -> 3 -> 4 -> 1 -> 2 etc. If you have any pending specs, they will
147
+ light up 1 -> 2 -> 1 -> 2 etc. When the test finishes, light up all
148
+ the status lights of the appropriate color.
149
+
150
+
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ libdir = File.expand_path(File.join(File.dirname(Gem.bin_path("switchy", "switchy", ">=0")), "..", "lib"))
3
+ cmd = "cucumber --require #{libdir}/sparky_cucumber.rb " + ARGV.map {|a| '"' + a.gsub(/"/, '\"') + '"' } * ' '
4
+ system(cmd)
5
+
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ class Sparky
4
+ def show_run
5
+ # system "switchy 1 0 2 1 3 1 4 1"
6
+ system "switchy 1 1 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 1"
7
+ end
8
+
9
+ def show_fail
10
+ system "switchy 1 0 2 1 3 0 4 0 5 0 6 0 7 0 8 0 9 1 10 0"
11
+ end
12
+
13
+ def show_pending
14
+ system "switchy 1 0 2 0 3 1 4 0 5 0 6 0 7 0 8 1 9 0 10 0"
15
+ end
16
+
17
+ def show_pass
18
+ system "switchy 1 0 2 0 3 0 4 1 5 1 6 1 7 1 8 0 9 0 10 0"
19
+ end
20
+
21
+ def show_reset
22
+ system "switchy 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0"
23
+ end
24
+
25
+ def show_all
26
+ system "switchy 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1"
27
+ end
28
+
29
+ def show_selftest
30
+ show_reset
31
+
32
+ show_all
33
+ sleep 1.0
34
+ show_reset
35
+
36
+ 1.upto(10) do |i|
37
+ system "switchy #{i} 1"
38
+ system "switchy #{i} 0"
39
+ end
40
+
41
+ %w(run fail pending pass).each do |msg|
42
+ send "show_#{msg}"
43
+ sleep 0.5
44
+ end
45
+ sleep 0.5
46
+ show_reset
47
+ end
48
+ end
49
+
50
+ if __FILE__==$0
51
+ s = Sparky.new
52
+
53
+ case ARGV[0].downcase
54
+ when "reset" then s.show_reset
55
+ when "pending" then s.show_pending
56
+ when "fail" then s.show_fail
57
+ when "pass" then s.show_pass
58
+ when "run" then s.show_run
59
+ when "test" then s.show_test
60
+ when "selftest" then s.show_selftest
61
+ when "spec"
62
+ lib_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'sparky_progress_formatter.rb'))
63
+ args = ARGV[1..-1].dup.map {|a| '"' + a.gsub(/"/, '\"') + '"' } * ' '
64
+ cmd = "spec --require #{lib_path} --format Spec::Runner::Formatter::SparkyProgressFormatter #{args}"
65
+ system(cmd)
66
+ else
67
+ # TODO: If spec or rake spec:*, bind formatter
68
+ # TODO: If autospec, bind formatter
69
+ s.show_run
70
+
71
+ cmd = ARGV.map {|a| '"' + a.gsub(/"/, '\"') + '"' } * ' '
72
+
73
+ if system(cmd)
74
+ s.show_pass
75
+ else
76
+ s.show_fail
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+
5
+ def usage
6
+ u = <<USAGE
7
+ switchy - turn external lights on/off
8
+ switchy <light> <0|1> [<light2> <0|1> [...]]
9
+
10
+ light:
11
+ 0 - Onboard LED (reversed: 0 = on, 1 = off)
12
+ 1-4 External Switches (1 = on)
13
+
14
+ example: Turn off onboard LED, turn on lights 2 and 4, turn off light 3, leave light 1 alone:
15
+ switchy 0 1 2 1 4 1 3 0
16
+ USAGE
17
+ end
18
+
19
+ require 'switchy'
20
+
21
+ args = ARGV.dup
22
+
23
+ s = Switchy.new
24
+ # The serial port is a bit tetchy. Give it a few cycles to settle.
25
+ sleep 0.05
26
+
27
+
28
+ # lights by number => pair of pins, one to set high, the other low
29
+ # TODO: change these into on/off arrays so we can set multiple lights with a single command
30
+ # TODO: consider dropping this altogether and doing "switchy C4 1 C5 0" etc?
31
+ lights = {
32
+ 0 => [nil, Switchy::PINS::D6 ],
33
+ 1 => [Switchy::PINS::C4, Switchy::PINS::C5 ],
34
+ 2 => [Switchy::PINS::C6, Switchy::PINS::C7 ],
35
+ 3 => [Switchy::PINS::B7, Switchy::PINS::B6 ],
36
+ 4 => [Switchy::PINS::B5, Switchy::PINS::B4 ],
37
+ 5 => [Switchy::PINS::B3, Switchy::PINS::B2 ],
38
+ 6 => [Switchy::PINS::D7, Switchy::PINS::B0 ],
39
+ 7 => [Switchy::PINS::D5, Switchy::PINS::D6 ],
40
+ 8 => [Switchy::PINS::D3, Switchy::PINS::D4 ],
41
+ 9 => [Switchy::PINS::D1, Switchy::PINS::D2 ],
42
+ 10 => [Switchy::PINS::C2, Switchy::PINS::D0 ],
43
+ }
44
+
45
+ until args.empty?
46
+ light = args.shift.to_i
47
+ command = args.shift.to_i
48
+
49
+ unless light >= 0 && light <= 10
50
+ puts usage
51
+ raise "ERROR: ARGV[1] must be between 0 and 10"
52
+ end
53
+
54
+ unless command >= 0 && command <= 1
55
+ puts usage
56
+ raise "ERROR: ARGV[2] must be one of on/off/status"
57
+ end
58
+
59
+ raise "ERROR: status not yet implemented" if command == 'status'
60
+
61
+ s.set_pin(lights[light][0], command) if lights[light][0]
62
+ s.set_pin(lights[light][1], 1-command) if lights[light][1]
63
+ end
64
+
65
+
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env ruby
2
+ dir = File.expand_path(File.dirname(__FILE__))
3
+ $: << dir unless $:.include?(dir)
4
+ require 'switchy'
5
+
6
+ class Sparky
7
+ attr_accessor :passed, :failed, :pending
8
+
9
+ @@run_pins = [[Switchy::PINS::C4, Switchy::PINS::C2], [Switchy::PINS::C5, Switchy::PINS::D0 ]]
10
+ @@fail_pins = [[Switchy::PINS::C6, Switchy::PINS::D1], [Switchy::PINS::C7, Switchy::PINS::D2]]
11
+ @@pending_pins = [[Switchy::PINS::B7, Switchy::PINS::D3], [Switchy::PINS::B6, Switchy::PINS::D4]]
12
+ @@pass_pins = [[Switchy::PINS::B3, Switchy::PINS::D7, Switchy::PINS::B5, Switchy::PINS::D5],
13
+ [Switchy::PINS::B2, Switchy::PINS::B0, Switchy::PINS::B4, Switchy::PINS::D6]]
14
+
15
+ @@reset_pins = [[Switchy::PINS::C4, Switchy::PINS::C2,
16
+ Switchy::PINS::C6, Switchy::PINS::D1,
17
+ Switchy::PINS::B7, Switchy::PINS::D3,
18
+ Switchy::PINS::B5, Switchy::PINS::B3,
19
+ Switchy::PINS::D7, Switchy::PINS::D5]]
20
+ def initialize
21
+ @passed, @failed, @pending = -1, -1, -1
22
+ @switchy = Switchy.new
23
+ end
24
+
25
+ def set_pins(pins)
26
+ pins.first.each do |pin|
27
+ @switchy.set_pin pin, 1
28
+ end
29
+ pins.last.each do |pin|
30
+ @switchy.set_pin pin, 0
31
+ end
32
+ end
33
+
34
+ def set_pin(pin)
35
+ @switchy.set_pin pin.first, 1
36
+ @switchy.set_pin pin.last, 0
37
+ end
38
+
39
+ def clear_pin(pin)
40
+ @switchy.set_pin pin.first, 0
41
+ end
42
+
43
+ def clear_pins(pins)
44
+ pins.first.each do |pin|
45
+ @switchy.set_pin pin, 0
46
+ end
47
+ end
48
+
49
+ def pass
50
+ set_pins @@pass_pins
51
+ end
52
+ alias :passed :pass
53
+
54
+ def clear_pass
55
+ clear_pins @@pass_pins
56
+ end
57
+
58
+ def fail
59
+ set_pins @@fail_pins
60
+ end
61
+ alias :failed :fail
62
+
63
+ def clear_failed
64
+ clear_pins @@fail_pins
65
+ end
66
+
67
+ def pending
68
+ set_pins @@pending_pins
69
+ end
70
+
71
+ def clear_pending
72
+ clear_pins @@pending_pins
73
+ end
74
+
75
+ def run
76
+ set_pins @@run_pins
77
+ end
78
+
79
+ def clear_run
80
+ clear_pins @@run_pins
81
+ end
82
+
83
+ def reset
84
+ clear_pins @@reset_pins
85
+ end
86
+
87
+ def start_run
88
+ reset
89
+ run
90
+ end
91
+
92
+ def finish_run
93
+ reset
94
+ if @failed > -1
95
+ failed
96
+ elsif @pending > -1
97
+ pending
98
+ else
99
+ pass
100
+ end
101
+ end
102
+
103
+ def example_passed
104
+ clear_pin pin(:passed, @passed % 4) if @passed >= 0
105
+ @passed += 1
106
+ set_pin pin(:passed, @passed % 4)
107
+ end
108
+
109
+ def example_failed
110
+ clear_pin pin(:failed, @failed % 2) if @failed >= 0
111
+ @failed += 1
112
+ set_pin pin(:failed, @failed % 2)
113
+ end
114
+
115
+ def example_pending
116
+ clear_pin pin(:pending, @pending % 2) if @pending >= 0
117
+ @pending += 1
118
+ set_pin pin(:pending, @pending % 2)
119
+ end
120
+
121
+ def pin(set, idx)
122
+ pins = case set
123
+ when :passed then @@pass_pins
124
+ when :failed then @@fail_pins
125
+ when :pending then @@pending_pins
126
+ end
127
+ [ pins.first[idx], pins.last[idx] ]
128
+ end
129
+ end
130
+
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+ gem 'cucumber', '>= 0.3.0'
3
+
4
+ require 'sparky'
5
+
6
+ module Cucumber
7
+ module Ast
8
+ class Visitor
9
+
10
+ alias :orig_visit_step_result :visit_step_result
11
+ alias :orig_visit_features :visit_features
12
+
13
+ def visit_features(features)
14
+ begin
15
+ @sparky = Sparky.new
16
+ @sparky.start_run
17
+ orig_visit_features(features)
18
+ ensure
19
+ @sparky.finish_run
20
+ end
21
+ end
22
+
23
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
24
+ @sparky.send "example_#{status}" if [:passed, :failed, :pending].include?(status)
25
+ orig_visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'spec/runner/formatter/progress_bar_formatter'
3
+ $: << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+ require 'sparky'
5
+
6
+ # TODO: rewire this to just patch the base class like I did in
7
+ # sparky_cucumber.rb. May be problematic as the child classes here
8
+ # ain't so good at calling super, so I may just need to patch the key
9
+ # formatters I normally use like ProgressBar and Html.
10
+
11
+ module Spec
12
+ module Runner
13
+ module Formatter
14
+ class SparkyProgressFormatter < ProgressBarFormatter
15
+ @@anything_failed_ever = false
16
+ @@anything_pended_ever = false
17
+
18
+ def initialize(a,b)
19
+ super
20
+ @sparky = Sparky.new
21
+ @sparky.start_run
22
+ end
23
+
24
+ def start_dump
25
+ @sparky.finish_run
26
+ super
27
+ end
28
+
29
+ def example_passed(example)
30
+ @sparky.example_passed
31
+ super
32
+ end
33
+
34
+ def example_failed(example, counter, failure)
35
+ @@anything_failed_ever = true
36
+ @sparky.example_failed
37
+ super
38
+ end
39
+
40
+ def example_pending(example, message)
41
+ @@anything_pended_ever = true
42
+ @sparky.example_pending
43
+ super
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "serialport"
4
+
5
+ class Switchy
6
+ module PINS
7
+ B0 = "B0"
8
+ B1 = "B1"
9
+ B2 = "B2"
10
+ B3 = "B3"
11
+ B4 = "B4"
12
+ B5 = "B5"
13
+ B6 = "B6"
14
+ B7 = "B7"
15
+
16
+ C2 = "C2"
17
+ C4 = "C4"
18
+ C5 = "C5"
19
+ C6 = "C6"
20
+ C7 = "C7"
21
+
22
+ D0 = "D0"
23
+ D1 = "D1"
24
+ D2 = "D2"
25
+ D3 = "D3"
26
+ D4 = "D4"
27
+ D5 = "D5"
28
+ D6 = "D6"
29
+ D7 = "D7"
30
+
31
+ OC1B = "C5"
32
+
33
+ OC1A = "C6"
34
+
35
+ ICP1 = "C7"
36
+ INT4 = "C7"
37
+
38
+ OC1C = "B7"
39
+
40
+ T1 = "B4"
41
+
42
+ M1S0 = "B3"
43
+
44
+ M0S1 = "B2"
45
+
46
+ SCLK = "B1"
47
+
48
+ SS = "B0"
49
+
50
+ INT7 = "D7"
51
+ HWB = "D7"
52
+ CTS = "D7"
53
+ T0 = "D7"
54
+
55
+ INT6 = "D6"
56
+ RTS = "D6"
57
+ LED = "D6"
58
+
59
+ XCK = "D5"
60
+
61
+ INT5 = "D4"
62
+
63
+ INT3 = "D3"
64
+ TXD1 = "D3"
65
+ TXD = "D3"
66
+
67
+ INT2 = "D2"
68
+ AIN1 = "D2"
69
+ RXD1 = "D2"
70
+ RXD = "D2"
71
+
72
+ INT1 = "D1"
73
+ AIN0 = "D1"
74
+
75
+ INT0 = "D0"
76
+ OC0B = "D0"
77
+
78
+ PD0 = "D0"
79
+ PD1 = "D1"
80
+ PD2 = "D2"
81
+ PD3 = "D3"
82
+ PD4 = "D4"
83
+ PD5 = "D5"
84
+ PD6 = "D6"
85
+ PD7 = "D7"
86
+ end
87
+
88
+ attr_accessor :modem, :baud
89
+ attr_accessor :borked # true when the device was not found at startup. Makes switchy-inclusive apps noncrashy when they find themselves unexpectedly switchy-excluded
90
+ def borked?; @borked; end
91
+
92
+ def initialize(modem = '/dev/tty.usbmodem12341', baud=38400)
93
+ @borked = !File.exists?(modem)
94
+ puts "**** Could not find Switchy device on #{modem}" if borked?
95
+ @modem, @baud = modem, baud
96
+ connect
97
+ end
98
+
99
+ def connect
100
+ return if borked?
101
+ @sp = SerialPort.new @modem, @baud
102
+ end
103
+
104
+ def disconnect
105
+ return if borked?
106
+ # ???
107
+ end
108
+
109
+ # Set pin "b4", 1 # turn on pin b4
110
+ def set_pin(p, v)
111
+ return if borked?
112
+ cmd = "#{p.upcase}=#{v}\r\n"
113
+ @sp.write cmd
114
+ end
115
+
116
+ def set_light(l, v)
117
+ return if borked?
118
+ cmd = "C#{l+3}=#{v}\r\n"
119
+ @sp.write cmd
120
+ end
121
+
122
+ def light1=(v)
123
+ return if borked?
124
+ set_light 1, v
125
+ end
126
+
127
+ def light2=(v)
128
+ return if borked?
129
+ set_light 2, v
130
+ end
131
+
132
+ def light3=(v)
133
+ return if borked?
134
+ set_light 3, v
135
+ end
136
+
137
+ def light4=(v)
138
+ return if borked?
139
+ set_light 4, v
140
+ end
141
+
142
+ end
143
+
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --require /Library/Ruby/Gems/1.8/gems/dbrady-switchy-0.2.2/lib/sparky_progress_formatter.rb
3
+ --format Spec::Runner::Formatter::SparkyProgressFormatter
4
+ --loadby mtime
5
+ --reverse
6
+ --backtrace
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: switchy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
5
+ platform: ruby
6
+ authors:
7
+ - David Brady
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-07-09 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ruby-serialport
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: Switchy USB serial load switcher
26
+ email: github@shinybit.com
27
+ executables:
28
+ - switchy
29
+ - sparky
30
+ - sparcumber
31
+ extensions: []
32
+
33
+ extra_rdoc_files:
34
+ - README.rdoc
35
+ - MIT-LICENSE
36
+ files:
37
+ - bin/sparky
38
+ - bin/switchy
39
+ - bin/sparcumber
40
+ - lib/sparky.rb
41
+ - lib/sparky_cucumber.rb
42
+ - lib/sparky_progress_formatter.rb
43
+ - res/spec.sparky.opts
44
+ - lib/switchy.rb
45
+ - README.rdoc
46
+ - MIT-LICENSE
47
+ has_rdoc: true
48
+ homepage: http://github.com/dbrady/switchy
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options:
53
+ - --line-numbers
54
+ - --inline-source
55
+ - --main
56
+ - README.rdoc
57
+ - --title
58
+ - Switchy - USB serial load switcher
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
73
+ requirements: []
74
+
75
+ rubyforge_project:
76
+ rubygems_version: 1.3.5
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: Switchy USB serial load switcher
80
+ test_files: []
81
+