knipper 0.0.1.dev3 → 0.0.1

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.
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/knipper.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Knipper::VERSION
9
9
  gem.authors = ["Erwin Boskma"]
10
10
  gem.email = ["erwin@datarift.nl"]
11
- gem.description = %q{Ruby wrapper for the blink(1) library}
11
+ gem.description = %q{Ruby wrapper for the blink(1) C-library}
12
12
  gem.summary = %q{Wraps the C-library that is available for the blink(1) USB status lights}
13
13
  gem.homepage = "http://github.com/eboskma/knipper"
14
14
 
@@ -17,5 +17,8 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_runtime_dependency "ffi", ['>= 1.2.0']
20
+ gem.add_runtime_dependency "ffi", ['~> 1.2.0']
21
+
22
+ gem.add_development_dependency "rspec", ['~> 2.12.0']
23
+ gem.add_development_dependency "knipper", ['>= 0.0.1.dev3']
21
24
  end
@@ -17,8 +17,13 @@ module Knipper
17
17
  attach_function :blink1_open, [], :pointer
18
18
  attach_function :blink1_openByPath, [:string], :pointer
19
19
  attach_function :blink1_close, [:pointer], :void
20
+ attach_function :blink1_play, [:pointer, :uchar, :uchar], :int
21
+ attach_function :blink1_writePatternLine, [:pointer, :ushort, :uchar, :uchar, :uchar, :uchar], :int
22
+ attach_function :blink1_readPatternLine, [:pointer, :pointer, :pointer, :pointer, :pointer, :uchar], :int
23
+ attach_function :blink1_degamma, [:int], :int
20
24
 
21
25
  attach_function :blink1_setRGB, [:pointer, :uchar, :uchar, :uchar], :int
22
26
  attach_function :blink1_fadeToRGB, [:pointer, :ushort, :uchar, :uchar, :uchar], :int
27
+
23
28
  end
24
29
  end
@@ -8,7 +8,6 @@ module Knipper
8
8
 
9
9
  num_devices = @@lib.blink1_enumerate
10
10
  devices = []
11
- puts "#{num_devices} blink(1) devices found"
12
11
  num_devices.times do |i|
13
12
  devices << @@lib.blink1_getCachedPath(i)
14
13
  end unless num_devices < 1
@@ -16,8 +15,8 @@ module Knipper
16
15
  devices
17
16
  end
18
17
 
19
- def self.finalize
20
- proc { @@lib.blink1_close @device }
18
+ def self.device_present?
19
+ devices.length > 0
21
20
  end
22
21
 
23
22
  def initialize(path = nil, &block)
@@ -32,8 +31,10 @@ module Knipper
32
31
  @@lib.blink1_close @device
33
32
  return
34
33
  end
35
-
36
- ObjectSpace.define_finalizer(self, self.class.finalize())
34
+ end
35
+
36
+ def close
37
+ @@lib.blink1_close @device
37
38
  end
38
39
 
39
40
  def fade_to_rgb(millis, red, green, blue)
@@ -43,5 +44,52 @@ module Knipper
43
44
  def set_rgb(red, green, blue)
44
45
  @@lib.blink1_setRGB(@device, red, green, blue)
45
46
  end
47
+
48
+ def write_pattern_line(millis, red, green, blue, pos)
49
+ @@lib.blink1_writePatternLine(@device, millis, red, green, blue, pos)
50
+ end
51
+
52
+ def read_pattern_line(pos)
53
+ millis = FFI::MemoryPointer.new(:ushort)
54
+ r = FFI::MemoryPointer.new(:uchar)
55
+ g = FFI::MemoryPointer.new(:uchar)
56
+ b = FFI::MemoryPointer.new(:uchar)
57
+ @@lib.blink1_readPatternLine(@device, millis, r, g, b, pos)
58
+
59
+ Knipper::Pattern::PatternLine.new({
60
+ millis: millis.read_uint16,
61
+ red: r.read_uint8,
62
+ green: g.read_uint8,
63
+ blue: b.read_uint8
64
+ })
65
+ end
66
+
67
+ def clear_pattern
68
+ 12.times do |i|
69
+ write_pattern_line 0, 0, 0, 0, i
70
+ end
71
+ end
72
+
73
+ def write_pattern(pattern, clear=true)
74
+ if pattern.is_a? String
75
+ pattern = Knipper::Pattern::Pattern.parse(pattern)
76
+ end
77
+
78
+ if pattern.is_a? Knipper::Pattern::Pattern
79
+ clear_pattern if clear
80
+
81
+ pattern.pattern.each do |pattern_line|
82
+ write_pattern_line pattern_line.millis, pattern_line.red, pattern_line.green, pattern_line.blue, pattern.pattern.index(pattern_line)
83
+ end
84
+ end
85
+ end
86
+
87
+ def start_pattern(pos)
88
+ @@lib.blink1_play(@device, 1, pos)
89
+ end
90
+
91
+ def stop_pattern
92
+ @@lib.blink1_play(@device, 0, 0)
93
+ end
46
94
  end
47
95
  end
@@ -0,0 +1,28 @@
1
+ module Knipper
2
+ module Pattern
3
+ class Pattern
4
+ attr_accessor :lines
5
+
6
+ def self.parse(s)
7
+ pattern = Pattern.new
8
+ s.lines do |l|
9
+ pattern.lines << PatternLine.parse(l.chomp)
10
+ end
11
+
12
+ pattern
13
+ end
14
+
15
+ def initialize
16
+ @lines = []
17
+ end
18
+
19
+ def <<(pattern_line)
20
+ if pattern_line.is_a? PatternLine
21
+ lines << pattern_line
22
+ elsif pattern_line.is_a? String
23
+ lines << PatternLine.parse(pattern_line)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ module Knipper
2
+ module Pattern
3
+ class PatternLine
4
+ attr_accessor :millis, :red, :green, :blue
5
+
6
+ PATTERN = /\A(\d+),(\d+),(\d+),(\d+)\z/
7
+
8
+ def self.parse(s)
9
+ parts = PATTERN.match(s)
10
+ raise "Unrecognized pattern -- #{s}" unless parts
11
+
12
+ pattern_line = PatternLine.new
13
+ pattern_line.millis = parts[1].to_i
14
+ pattern_line.red = parts[2].to_i
15
+ pattern_line.green = parts[3].to_i
16
+ pattern_line.blue = parts[4].to_i
17
+
18
+ pattern_line
19
+ end
20
+
21
+ def initialize(attributes = {})
22
+ attributes.each do |name, value|
23
+ send("#{name}=", value)
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,2 @@
1
+ require 'knipper/pattern/pattern_line'
2
+ require 'knipper/pattern/pattern'
@@ -1,3 +1,3 @@
1
1
  module Knipper
2
- VERSION = "0.0.1.dev3"
2
+ VERSION = "0.0.1"
3
3
  end
data/lib/knipper.rb CHANGED
@@ -1,3 +1,4 @@
1
- require "knipper/version"
1
+ require 'knipper/version'
2
2
  require 'knipper/blink1_lib'
3
- require 'knipper/device'
3
+ require 'knipper/device'
4
+ require 'knipper/pattern'
@@ -0,0 +1,38 @@
1
+ require "spec_helper"
2
+
3
+ describe Knipper::Device do
4
+ it "opens a device" do
5
+ d = Knipper::Device.new
6
+ d.should_not be_nil
7
+ d.close
8
+ d = nil
9
+ end
10
+
11
+ it "sets a color" do
12
+ device = Knipper::Device.new
13
+ result = device.set_rgb(255, 0, 0)
14
+ result.should be >= 0
15
+ device.close
16
+ end
17
+
18
+ it "fades to a color" do
19
+ device = Knipper::Device.new
20
+ result = device.fade_to_rgb(100, 0, 255, 0)
21
+ result.should be >= 0
22
+ device.close
23
+ end
24
+
25
+ it "writes a pattern" do
26
+ device = Knipper::Device.new
27
+ lib = Knipper::Blink1Lib.new
28
+ device.clear_pattern
29
+ result = device.write_pattern_line 500, 100, 150, 200, 0
30
+ result.should be >= 0
31
+ pattern = device.read_pattern_line 0
32
+ pattern.millis.should eq 500
33
+ pattern.red.should eq lib.blink1_degamma(100)
34
+ pattern.green.should eq lib.blink1_degamma(150)
35
+ pattern.blue.should eq lib.blink1_degamma(200)
36
+ device.close
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe Knipper::Pattern::PatternLine do
4
+ it "parses a valid string" do
5
+ pattern_str = "500,128,65,233"
6
+ pattern = Knipper::Pattern::PatternLine.parse(pattern_str)
7
+
8
+ pattern.should_not be_nil
9
+ pattern.millis.should eq 500
10
+ pattern.red.should eq 128
11
+ pattern.green.should eq 65
12
+ pattern.blue.should eq 233
13
+ end
14
+
15
+ it "raises an error when parsing an invalid string" do
16
+ pattern_str = "asdf"
17
+ expect { Knipper::Pattern::PatternLine.parse(pattern_str) }.to raise_error("Unrecognized pattern -- #{pattern_str}")
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Knipper::Pattern::Pattern do
4
+ it "parses a series of pattern lines" do
5
+ pattern_str = <<EOF
6
+ 0,1,2,3
7
+ 1,2,3,4
8
+ 2,3,4,5
9
+ 3,4,5,6
10
+ 4,5,6,7
11
+ EOF
12
+ pattern = Knipper::Pattern::Pattern.parse(pattern_str)
13
+
14
+ pattern.lines.should_not be_nil
15
+ pattern.lines.length.should eq 5
16
+ pattern.lines.length.times do |i|
17
+ pattern.lines[i].millis.should eq i
18
+ pattern.lines[i].red.should eq i + 1
19
+ pattern.lines[i].green.should eq i + 2
20
+ pattern.lines[i].blue.should eq i + 3
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,43 @@
1
+ require 'knipper'
2
+
3
+ class BlinkFormatter < RSpec::Core::Formatters::BaseFormatter
4
+ def initialize(output)
5
+ super(output)
6
+ end
7
+
8
+ # def start(count)
9
+ # super(count)
10
+ # Knipper::Device.new { |d| d.fade_to_rgb 100, 0, 0, 0 }
11
+ # end
12
+
13
+ def stop
14
+ return unless Knipper::Device.device_present?
15
+
16
+ if @failed_examples.length > 0
17
+ Knipper::Device.new { |d| d.fade_to_rgb 500, 255, 0, 0 }
18
+ else
19
+ Knipper::Device.new { |d| d.fade_to_rgb 500, 0, 255, 0 }
20
+ end
21
+ end
22
+ end
23
+
24
+ # This file was generated by the `rspec --init` command. Conventionally, all
25
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
26
+ # Require this file using `require "spec_helper"` to ensure that it is only
27
+ # loaded once.
28
+ #
29
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
30
+ RSpec.configure do |config|
31
+ config.treat_symbols_as_metadata_keys_with_true_values = true
32
+ config.run_all_when_everything_filtered = true
33
+ config.filter_run :focus
34
+ config.filter_run_excluding :skip
35
+
36
+ config.add_formatter BlinkFormatter
37
+ # Run specs in random order to surface order dependencies. If you find an
38
+ # order dependency and want to debug it, you can fix the order by providing
39
+ # the seed, which is printed after each run.
40
+ # --seed 1234
41
+ config.order = 'random'
42
+ end
43
+
metadata CHANGED
@@ -1,22 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.dev3
5
- prerelease: 6
4
+ version: 0.0.1
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Erwin Boskma
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-20 00:00:00.000000000 Z
12
+ date: 2013-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
21
  version: 1.2.0
22
22
  type: :runtime
@@ -24,10 +24,42 @@ dependencies:
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.2.0
30
- description: Ruby wrapper for the blink(1) library
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.12.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.12.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: knipper
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.0.1.dev3
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.1.dev3
62
+ description: Ruby wrapper for the blink(1) C-library
31
63
  email:
32
64
  - erwin@datarift.nl
33
65
  executables: []
@@ -35,6 +67,7 @@ extensions: []
35
67
  extra_rdoc_files: []
36
68
  files:
37
69
  - .gitignore
70
+ - .rspec
38
71
  - Gemfile
39
72
  - LICENSE.txt
40
73
  - README.md
@@ -43,7 +76,14 @@ files:
43
76
  - lib/knipper.rb
44
77
  - lib/knipper/blink1_lib.rb
45
78
  - lib/knipper/device.rb
79
+ - lib/knipper/pattern.rb
80
+ - lib/knipper/pattern/pattern.rb
81
+ - lib/knipper/pattern/pattern_line.rb
46
82
  - lib/knipper/version.rb
83
+ - spec/device_spec.rb
84
+ - spec/pattern_line_spec.rb
85
+ - spec/pattern_spec.rb
86
+ - spec/spec_helper.rb
47
87
  homepage: http://github.com/eboskma/knipper
48
88
  licenses: []
49
89
  post_install_message:
@@ -58,17 +98,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
98
  version: '0'
59
99
  segments:
60
100
  - 0
61
- hash: 2441054257148417000
101
+ hash: -2175147279034420234
62
102
  required_rubygems_version: !ruby/object:Gem::Requirement
63
103
  none: false
64
104
  requirements:
65
- - - ! '>'
105
+ - - ! '>='
66
106
  - !ruby/object:Gem::Version
67
- version: 1.3.1
107
+ version: '0'
108
+ segments:
109
+ - 0
110
+ hash: -2175147279034420234
68
111
  requirements: []
69
112
  rubyforge_project:
70
113
  rubygems_version: 1.8.23
71
114
  signing_key:
72
115
  specification_version: 3
73
116
  summary: Wraps the C-library that is available for the blink(1) USB status lights
74
- test_files: []
117
+ test_files:
118
+ - spec/device_spec.rb
119
+ - spec/pattern_line_spec.rb
120
+ - spec/pattern_spec.rb
121
+ - spec/spec_helper.rb