l8 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6fbeb7ae2a7a1fbcb47b2e4f0c4ced2810997675
4
+ data.tar.gz: a68aebbe99f0ad2924f5b6522f787d0c6e3b429b
5
+ SHA512:
6
+ metadata.gz: c04d80b18bb0be522c3f09dab1e8646ea6f43f68c07bcc4214d4907b70c7f002c0c48c5ee218a03f3aa2a1b3c71bc3edeef16edc946bf6927b7279fec3689f86
7
+ data.tar.gz: d439fe657d18f5e2240a327d3347dc02ab96787218e7b95fabf75d39f4080197af0e7736bca0d42cd8d985012e82cd4c61aa9d3a6bfc49428e3a02893cff6968
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ /.bundle/
2
+ /.idea/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
11
+ *.bundle
12
+ *.so
13
+ *.o
14
+ *.a
15
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in l8.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Brian Kelly
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ [![Build Status](https://travis-ci.org/spilth/l8.svg?branch=master)](https://travis-ci.org/spilth/l8)
2
+
3
+ # L8
4
+
5
+ A gem for communicating with an [L8 SmartLight](http://l8smartlight.com) over USB.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'l8'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install l8
22
+
23
+ ## Usage
24
+
25
+ To connect to your L8 Smartlight, determine the serial port it's on:
26
+
27
+ require 'l8'
28
+ l8 = L8::Smartlight.new('/dev/tty.usbmodem1421')
29
+
30
+ ### Changing LEDs
31
+
32
+ Use `set_led` to set one of the LEDs to a color. The arguments are:
33
+
34
+ - x coordinate of the LED (0..7)
35
+ - y coordinate of the LED (0..7)
36
+ - red color value (0..15)
37
+ - green color value (0..15)
38
+ - blue color values (0..15)
39
+
40
+ For example, to set the 5th LED in the 3rd row to orange:
41
+
42
+ l8.set_led(2, 4, 15, 7, 0)
43
+
44
+ ### Clearing the LEDs
45
+
46
+ Use the `clear_matrix` method:
47
+
48
+ l8.clear_matrix
49
+
50
+ ### Changing the Super (Back) LED
51
+
52
+ Use the `set_superled` method and pass 3 color values (0..15):
53
+
54
+ l8.set_superled(0, 0, 15)
55
+
56
+ ## Contributing
57
+
58
+ 1. Fork it ( https://github.com/spilth/l8/fork )
59
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
60
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
61
+ 4. Push to the branch (`git push origin my-new-feature`)
62
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => [:spec, :build]
@@ -0,0 +1,66 @@
1
+ require 'l8'
2
+ require 'rest_client'
3
+ require 'json'
4
+
5
+ def pending(index)
6
+ @l8.set_led(0, index, 3, 3, 0)
7
+ end
8
+
9
+ def success(index)
10
+ @l8.set_led(0, index, 0, 15, 0)
11
+ end
12
+
13
+ def failure(index)
14
+ @l8.set_led(0, index, 15, 0, 0)
15
+ @l8.set_superled(15,0,0)
16
+ end
17
+
18
+ def fill_timer
19
+ (0..7).each { |i| @l8.set_led(7, i, 1, 1, 1) }
20
+ end
21
+
22
+ def waiting_progress
23
+ (0..7).each do |i|
24
+ sleep 8
25
+ @l8.set_led(7, 7 - i, 0, 0, 0)
26
+ end
27
+ end
28
+
29
+ def get_status(url)
30
+ response = RestClient.get url
31
+ json = JSON.parse(response)
32
+ json[0]['result']
33
+ end
34
+
35
+ @l8 = L8::Smartlight.new('/dev/tty.usbmodem1411')
36
+
37
+ @projects = %w(
38
+ https://api.travis-ci.org/repos/pivotal/pivotal-life/builds
39
+ https://api.travis-ci.org/repos/spilth/little_bits/builds
40
+ https://api.travis-ci.org/repositories/rdkit/rdkit/builds
41
+ https://api.travis-ci.org/repos/spilth/wedderdotcom/builds
42
+ https://api.travis-ci.org/repos/spilth/ubyray/builds
43
+ https://api.travis-ci.org/repos/spilth/littlebits-travis-webhook/builds
44
+ https://api.travis-ci.org/repos/sir-dunxalot/ember-flash-messages/builds
45
+ )
46
+
47
+ @l8.clear_matrix
48
+
49
+ while true
50
+ @l8.set_superled(0,15,0)
51
+ @projects.each_with_index do |url, index|
52
+ pending(index)
53
+
54
+ if get_status(url) == 0
55
+ success(index)
56
+ else
57
+ failure(index)
58
+ end
59
+ end
60
+
61
+ fill_timer
62
+
63
+ waiting_progress
64
+ end
65
+
66
+
data/examples/draw.rb ADDED
@@ -0,0 +1,59 @@
1
+ require 'l8'
2
+ require 'io/console'
3
+
4
+ @l8 = L8::Smartlight.new("/dev/tty.usbmodem1411")
5
+
6
+ @x = 0
7
+ @y = 0
8
+
9
+ def read_char
10
+ STDIN.echo = false
11
+ STDIN.raw!
12
+
13
+ input = STDIN.getc.chr
14
+ if input == "\e" then
15
+ input << STDIN.read_nonblock(3) rescue nil
16
+ input << STDIN.read_nonblock(2) rescue nil
17
+ end
18
+ ensure
19
+ STDIN.echo = true
20
+ STDIN.cooked!
21
+
22
+ return input
23
+ end
24
+
25
+ def show_single_key
26
+ c = read_char
27
+
28
+ @l8.set_led(@x,@y, 15,15,15)
29
+
30
+ case c
31
+ when " "
32
+ puts "SPACE"
33
+ when "\e[A"
34
+ # up
35
+ @x = @x - 1
36
+ when "\e[B"
37
+ # up
38
+ @x = @x + 1
39
+ when "\e[C"
40
+ # right
41
+ @y = @y + 1
42
+ when "\e[D"
43
+ # left
44
+ @y = @y - 1
45
+ when "\u0003"
46
+ puts "CONTROL-C"
47
+ exit 0
48
+ else
49
+ puts "SOMETHING ELSE: #{c.inspect}"
50
+ end
51
+
52
+ @l8.set_led(@x,@y, 0,15,0)
53
+ end
54
+
55
+ @l8.clear_matrix
56
+
57
+ @l8.set_led(@x,@y, 0,15,0)
58
+
59
+ show_single_key while(true)
data/l8.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'l8/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "l8"
8
+ spec.version = L8::VERSION
9
+ spec.authors = ["Brian Kelly"]
10
+ spec.email = ["polymonic@gmail.com"]
11
+ spec.summary = %q{Gem for communicating with an L8 SmartLight}
12
+ spec.homepage = "https://github.com/spilth/l8"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_runtime_dependency 'rubyserial'
21
+ spec.add_runtime_dependency 'digest-crc'
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.7"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec"
26
+ end
@@ -0,0 +1,71 @@
1
+ require 'rubyserial'
2
+
3
+ module L8
4
+ class Smartlight
5
+ CMD_L8_LED_SET = 0x43
6
+ CMD_L8_MATRIX_OFF = 0x45
7
+ CMD_L8_SUPERLED_SET = 0x4b
8
+ CMD_L8_STATUSLEDS_ENABLE = 0x9e
9
+ CMD_L8_SET_LOW_BRIGHTNESS = 0x9a
10
+ POWEROFF = 0x9d
11
+ MATRIX_SET = 0x44
12
+
13
+ def initialize(serial_port)
14
+ @serial_port = Serial.new(serial_port)
15
+ end
16
+
17
+ def clear_matrix
18
+ @serial_port.write Util.frame([CMD_L8_MATRIX_OFF])
19
+ end
20
+
21
+ def set_led(x, y, r, g, b)
22
+ payload = [CMD_L8_LED_SET, x, y, b, g, r, 0x00]
23
+
24
+ @serial_port.write Util.frame(payload)
25
+ end
26
+
27
+ def set_superled(r,g,b)
28
+ payload = [CMD_L8_SUPERLED_SET, b, g, r]
29
+
30
+ @serial_port.write Util.frame(payload)
31
+ end
32
+
33
+ def enable_status_leds
34
+ payload = [CMD_L8_STATUSLEDS_ENABLE, 1]
35
+
36
+ @serial_port.write Util.frame(payload)
37
+ end
38
+
39
+ def disable_status_leds
40
+ payload = [CMD_L8_STATUSLEDS_ENABLE, 0]
41
+
42
+ @serial_port.write Util.frame(payload)
43
+ end
44
+
45
+ def set_brightness(level)
46
+ brightness = 0
47
+
48
+ if level == :low
49
+ brightness = 2
50
+ elsif level == :medium
51
+ brightness = 1
52
+ end
53
+
54
+ payload = [CMD_L8_SET_LOW_BRIGHTNESS, brightness]
55
+
56
+ @serial_port.write Util.frame(payload)
57
+ end
58
+
59
+ def power_off
60
+ @serial_port.write Util.frame([POWEROFF])
61
+ end
62
+
63
+ def set_matrix(pixels)
64
+ data = Util.pixels_to_two_byte_array(pixels)
65
+
66
+ payload = [MATRIX_SET] + data
67
+
68
+ @serial_port.write Util.frame(payload)
69
+ end
70
+ end
71
+ end
data/lib/l8/util.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'digest/crc8'
2
+
3
+ module L8
4
+ class Util
5
+ HEADER = [0xaa, 0x55]
6
+
7
+ def self.to_two_byte_color(r, g, b)
8
+ [(0.to_s(16) + b.to_s(16)).hex] + [(g.to_s(16) + r.to_s(16)).hex]
9
+ end
10
+
11
+ def self.pixels_to_two_byte_array(pixels)
12
+ data = []
13
+ pixels.each_slice(3) { |slice| data.concat to_two_byte_color(slice[0], slice[1], slice[2]) }
14
+ data
15
+ end
16
+
17
+ def self.frame(payload)
18
+ crc8 = Digest::CRC8.new
19
+ crc8 << payload.pack('C*')
20
+
21
+ frame = HEADER + [payload.size] + payload << crc8.checksum
22
+ frame.pack('C*')
23
+ end
24
+ end
25
+ end
data/lib/l8/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module L8
2
+ VERSION = "0.0.1"
3
+ end
data/lib/l8.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'l8/version'
2
+ require 'l8/smartlight'
3
+ require 'l8/util'
4
+
5
+ module L8
6
+
7
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ module L8
4
+ describe Smartlight do
5
+ let(:serial_port) { double(:serial_port) }
6
+ describe '#set_led' do
7
+ it 'sets the color of the LED at given location' do
8
+ allow(Serial).to receive(:new).with('serial_port') { serial_port }
9
+ allow(Util).to receive(:frame).with([Smartlight::CMD_L8_LED_SET, 3, 0, 15, 15, 15, 0]) { 'foo'}
10
+ allow(serial_port).to receive(:write).with('foo')
11
+
12
+ l8 = L8::Smartlight.new('serial_port')
13
+ l8.set_led(3, 0, 15, 15, 15)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ module L8
4
+ describe Util do
5
+ describe '.to_two_byte_color' do
6
+ it 'converts rgb values into two byte format (0x0BGR)' do
7
+ expect(Util.to_two_byte_color(15,15,15)).to eq([15, 255])
8
+ expect(Util.to_two_byte_color(0,0,0)).to eq([0,0])
9
+ end
10
+ end
11
+
12
+ describe '.pixel_array_to_two_byte_array' do
13
+ it 'returns an array of two byte pairs' do
14
+ expect(Util.pixels_to_two_byte_array([0,0,0])).to eq([0, 0])
15
+ expect(Util.pixels_to_two_byte_array([0,15,0])).to eq([0, 240])
16
+ expect(Util.pixels_to_two_byte_array([15,15,15])).to eq([15, 255])
17
+
18
+ expect(Util.pixels_to_two_byte_array([0,0,0,0,0,0])).to eq([0, 0, 0 ,0])
19
+ expect(Util.pixels_to_two_byte_array([15,15,15, 15, 15, 15])).to eq([15, 255, 15, 255])
20
+ end
21
+ end
22
+
23
+ describe '.frame' do
24
+ it 'converts the payload into a checksummed frame' do
25
+ expect(Util.frame([0x43, 0x03, 0x00, 0x0f, 0x0f, 0x0f, 0x00])).to eq("\xaa\x55\x07\x43\x03\x00\x0f\x0f\x0f\x00\x0e".b)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,92 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
4
+ # file to always be loaded, without a need to explicitly require it in any files.
5
+ #
6
+ # Given that it is always loaded, you are encouraged to keep this file as
7
+ # light-weight as possible. Requiring heavyweight dependencies from this file
8
+ # will add to the boot time of your test suite on EVERY test run, even for an
9
+ # individual file that may not need all of that loaded. Instead, consider making
10
+ # a separate helper file that requires the additional dependencies and performs
11
+ # the additional setup, and require it from the spec files that actually need it.
12
+ #
13
+ # The `.rspec` file also contains a few flags that are not defaults but that
14
+ # users commonly want.
15
+ #
16
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
17
+
18
+ require './lib/l8'
19
+
20
+ RSpec.configure do |config|
21
+ # rspec-expectations config goes here. You can use an alternate
22
+ # assertion/expectation library such as wrong or the stdlib/minitest
23
+ # assertions if you prefer.
24
+ config.expect_with :rspec do |expectations|
25
+ # This option will default to `true` in RSpec 4. It makes the `description`
26
+ # and `failure_message` of custom matchers include text for helper methods
27
+ # defined using `chain`, e.g.:
28
+ # be_bigger_than(2).and_smaller_than(4).description
29
+ # # => "be bigger than 2 and smaller than 4"
30
+ # ...rather than:
31
+ # # => "be bigger than 2"
32
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
33
+ end
34
+
35
+ # rspec-mocks config goes here. You can use an alternate test double
36
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
37
+ config.mock_with :rspec do |mocks|
38
+ # Prevents you from mocking or stubbing a method that does not exist on
39
+ # a real object. This is generally recommended, and will default to
40
+ # `true` in RSpec 4.
41
+ mocks.verify_partial_doubles = true
42
+ end
43
+
44
+ # The settings below are suggested to provide a good initial experience
45
+ # with RSpec, but feel free to customize to your heart's content.
46
+ =begin
47
+ # These two settings work together to allow you to limit a spec run
48
+ # to individual examples or groups you care about by tagging them with
49
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
50
+ # get run.
51
+ config.filter_run :focus
52
+ config.run_all_when_everything_filtered = true
53
+
54
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
55
+ # For more details, see:
56
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
57
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
58
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
59
+ config.disable_monkey_patching!
60
+
61
+ # This setting enables warnings. It's recommended, but in some cases may
62
+ # be too noisy due to issues in dependencies.
63
+ config.warnings = true
64
+
65
+ # Many RSpec users commonly either run the entire suite or an individual
66
+ # file, and it's useful to allow more verbose output when running an
67
+ # individual spec file.
68
+ if config.files_to_run.one?
69
+ # Use the documentation formatter for detailed output,
70
+ # unless a formatter has already been configured
71
+ # (e.g. via a command-line flag).
72
+ config.default_formatter = 'doc'
73
+ end
74
+
75
+ # Print the 10 slowest examples and example groups at the
76
+ # end of the spec run, to help surface which specs are running
77
+ # particularly slow.
78
+ config.profile_examples = 10
79
+
80
+ # Run specs in random order to surface order dependencies. If you find an
81
+ # order dependency and want to debug it, you can fix the order by providing
82
+ # the seed, which is printed after each run.
83
+ # --seed 1234
84
+ config.order = :random
85
+
86
+ # Seed global randomization in this process using the `--seed` CLI option.
87
+ # Setting this allows you to use `--seed` to deterministically reproduce
88
+ # test failures related to randomization by passing the same `--seed` value
89
+ # as the one that triggered the failure.
90
+ Kernel.srand config.seed
91
+ =end
92
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: l8
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brian Kelly
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rubyserial
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: digest-crc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.7'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - polymonic@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".ruby-version"
93
+ - Gemfile
94
+ - LICENSE.txt
95
+ - README.md
96
+ - Rakefile
97
+ - examples/build_status.rb
98
+ - examples/draw.rb
99
+ - l8.gemspec
100
+ - lib/l8.rb
101
+ - lib/l8/smartlight.rb
102
+ - lib/l8/util.rb
103
+ - lib/l8/version.rb
104
+ - spec/lib/smartlight_spec.rb
105
+ - spec/lib/util_spec.rb
106
+ - spec/spec_helper.rb
107
+ homepage: https://github.com/spilth/l8
108
+ licenses:
109
+ - MIT
110
+ metadata: {}
111
+ post_install_message:
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 2.2.2
128
+ signing_key:
129
+ specification_version: 4
130
+ summary: Gem for communicating with an L8 SmartLight
131
+ test_files:
132
+ - spec/lib/smartlight_spec.rb
133
+ - spec/lib/util_spec.rb
134
+ - spec/spec_helper.rb