pixo 0.3.2 → 0.4.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0f34bd6751d6cba5bfa084708d71eed1dee942e
4
- data.tar.gz: bee2d3a708af823d48cd2a303216a76930528601
3
+ metadata.gz: ab47761e84f228f514a4e7118207a388cd813463
4
+ data.tar.gz: bd2121709d447827d27cf2a1616a65f9eaa7ad35
5
5
  SHA512:
6
- metadata.gz: c841a49f9d6652dadb2552fbb16d8a81bf989d2c0ce6248bdb6f2898d1d1acb7f74d48a6dc46768c9e2aa8d786f8ff9919c6ee0efedeedb04f2963e6f386e506
7
- data.tar.gz: ea5edabe67c2144514cd2e430995829b3180af646a5a83dcb648f87209accb55e700c61892a8175356102977bd4e366ab65074c8abebf0c831c7d58460163131
6
+ metadata.gz: 29ca3f9f59fe05884d3701dcc0b2ed5b977325ffe6ff8586a51994a7f4511eb9762da2d89a307f5191757fae546d4b30b820757e9c27c2129f04018fd0abc955
7
+ data.tar.gz: b3db77d49b09d3834c6fe6dd9cba31e87c8a55fc291b79cad665d7a8a0f404a60db491f9f71d995e960d2318d819de4b383d73490e967fe9e08af30d2e99d89a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pixo (0.3.2)
4
+ pixo (0.4.0)
5
5
  concurrent-ruby
6
6
 
7
7
  GEM
@@ -16,6 +16,8 @@ GEM
16
16
  rspec-core (~> 3.6.0)
17
17
  rspec-expectations (~> 3.6.0)
18
18
  rspec-mocks (~> 3.6.0)
19
+ rspec-collection_matchers (1.1.3)
20
+ rspec-expectations (>= 2.99.0.beta1)
19
21
  rspec-core (3.6.0)
20
22
  rspec-support (~> 3.6.0)
21
23
  rspec-expectations (3.6.0)
@@ -35,6 +37,7 @@ DEPENDENCIES
35
37
  rake (~> 10.0)
36
38
  rake-compiler (~> 1.0)
37
39
  rspec (>= 3.0)
40
+ rspec-collection_matchers (>= 1.1.3)
38
41
 
39
42
  BUNDLED WITH
40
43
  1.15.4
@@ -6,39 +6,37 @@ require File.expand_path('../../libpixgem', __FILE__)
6
6
  module Pixo
7
7
  class Application < Pixo::Native::Application
8
8
  attr_accessor :running, :leds_on
9
+ attr_reader :patterns
9
10
 
10
11
  def initialize()
11
12
  super
12
- self.running = false
13
- self.brightness = 1.0
14
- self.leds_on = true
15
13
  @procs = Array.new
16
14
 
17
15
  @procs_lock = Mutex.new
18
-
19
- @service = Pixo::Ipc::Service.new(STDIN, STDOUT, user_data: self)
20
-
21
- @service_thread = Thread.new do
22
- while(!self.running)
23
- sleep 0.1
24
- end
25
- @service.run
26
- self.shutdown
27
- end
16
+ @started_latch = Concurrent::CountDownLatch.new(1)
17
+ @service = Pixo::Rpc::ApplicationService.new(STDIN, STDOUT, self, @started_latch)
18
+
19
+ @patterns = Concurrent::Hash.new
20
+
21
+ @active_pattern = BlankPattern.new
22
+ self.running = false
23
+ self.brightness = 1.0
24
+ self.leds_on = true
28
25
  end
29
26
 
30
27
  def run
31
- self.running = tick(active_pattern, brightness)
32
-
28
+ self.running = tick(@active_pattern, brightness)
29
+ @started_latch.count_down
33
30
  while(running)
34
31
  @procs_lock.synchronize {
35
32
  @procs.each {|proc| proc.call(self) }
36
33
  @procs.clear
37
34
  }
38
35
 
39
- self.running = tick(active_pattern, brightness) && running
36
+ self.running = tick(@active_pattern, brightness) && running
40
37
  end
41
38
  ensure
39
+ @service.shutdown
42
40
  close
43
41
  end
44
42
 
@@ -46,6 +44,14 @@ module Pixo
46
44
  self.running = false
47
45
  end
48
46
 
47
+ def add_pattern(name, code)
48
+ self.patterns[name] = Pixo::Native::Pattern.new(code)
49
+ end
50
+
51
+ def add_fadecandy(hostname, count)
52
+ super(Pixo::Native::FadeCandy.new(hostname, count))
53
+ end
54
+
49
55
  def post(proc)
50
56
  @procs_lock.synchronize {
51
57
  @procs << proc
@@ -53,32 +59,21 @@ module Pixo
53
59
  end
54
60
 
55
61
  def key_callback(key, scancode, action, mods)
56
- @service.request(Pixo::Renderer::OnKey.new(key, scancode, action, mods), async: true)
62
+ @service.request(Pixo::Rpc::OnKey.new(key, scancode, action, mods), async: true)
57
63
  end
58
64
 
59
- def patterns
60
- unless @patterns
61
- @patterns = Hash.new
62
- patterns_dir = File.join(File.dirname(__FILE__), "..", "..", 'ext', 'pixo', 'patterns')
63
- Dir.entries(patterns_dir).each do | pattern_file|
64
- next unless pattern_file.end_with?('.glsl')
65
- @patterns[pattern_file] = Pixo::Native::Pattern.new(File.read(File.join(patterns_dir, pattern_file)))
66
- end
65
+ def pattern=(name)
66
+ pat = patterns[name]
67
+ if (pat)
68
+ pat.reset_start
69
+ @active_pattern = pat
67
70
  end
68
- @patterns
69
- end
70
-
71
- def active_pattern
72
- @active_pattern ||= random_pattern
73
- end
74
71
 
75
- def random_pattern
76
- patterns[patterns.keys.sample]
72
+ pattern
77
73
  end
78
74
 
79
- def active_pattern=(pattern)
80
- pattern.reset_start
81
- @active_pattern = pattern
75
+ def pattern
76
+ patterns.key(@active_pattern)
82
77
  end
83
78
 
84
79
  def brightness=(val)
@@ -96,10 +91,18 @@ module Pixo
96
91
 
97
92
  private
98
93
 
94
+ class BlankPattern < Pixo::Native::Pattern
95
+ def initialize
96
+ super(<<-EOF)
97
+ #version 330 core
98
+ out vec4 color_out;
99
99
 
100
-
100
+ void main( void ) {
101
+ color_out = vec4( 0.0, 0.0, 0.0, 1.0 );
102
+ }
103
+ EOF
104
+ end
105
+ end
101
106
  end
102
-
103
-
104
107
  end
105
108
 
data/lib/pixo/renderer.rb CHANGED
@@ -1,148 +1,51 @@
1
1
  module Pixo
2
- class Renderer
3
- attr_reader :service, :service_thread
4
-
5
- class OnKey
6
- def initialize(key, scancode, action, mods)
7
- @key = key
8
- @scancode = scancode
9
- @action = action
10
- @mods = mods
11
- end
12
-
13
- def call(service)
14
- service.on_key(@key, @scancode, @action, @mods)
15
- self
16
- end
17
- end
18
-
19
- class Service < Pixo::Ipc::Service
20
- attr_reader :renderer
21
-
22
- def initialize(renderer)
23
- @renderer = renderer
24
- i, o, t = Open3.popen2('bundle exec pixo')
25
- super(o, i)
26
- @service_thread = Thread.new { self.run }
27
- end
28
-
29
-
30
- def on_key(key, scancode, action, mods)
31
- renderer.on_key(key, scancode, action, mods)
32
- end
33
-
34
- end
2
+ class Renderer < Pixo::Rpc::Service
3
+ attr_reader :service_thread
35
4
 
36
5
  def initialize
37
- @service = Pixo::Renderer::Service.new(self)
6
+ i, o, t = Open3.popen2('bundle exec pixo')
7
+ super(o, i)
8
+ @service_thread = Thread.new { self.run }
38
9
  end
39
10
 
40
11
  def on_key(key, scancode, action, mods)
41
12
 
42
13
  end
43
14
 
44
- def pattern_names
45
- service.request(Pixo::Renderer::GetPatternNames.new)
15
+ def list_patterns
16
+ request(Pixo::Rpc::ListPatterns.new)
46
17
  end
47
18
 
48
- def active_pattern
49
- service.request(Pixo::Renderer::GetPatternName.new)
19
+ def pattern
20
+ request(Pixo::Rpc::GetPattern.new)
50
21
  end
51
22
 
52
- def active_pattern=(name)
53
- service.request(Pixo::Renderer::SetPattern.new(name), async: true)
23
+ def pattern=(name)
24
+ request(Pixo::Rpc::SetPattern.new(name))
54
25
  end
55
26
 
56
27
  def brightness=(brightness)
57
- service.request(Pixo::Renderer::SetBrightness.new(brightness))
28
+ request(Pixo::Rpc::SetBrightness.new(brightness))
58
29
  end
59
30
 
60
31
  def brightness
61
- service.request(Pixo::Renderer::GetBrightness.new())
32
+ request(Pixo::Rpc::GetBrightness.new())
62
33
  end
63
34
 
64
35
  def leds_on=(leds_on)
65
- service.request(Pixo::Renderer::SetLedsOn.new(leds_on))
36
+ request(Pixo::Rpc::SetLedsOn.new(leds_on))
66
37
  end
67
38
 
68
39
  def leds_on
69
- service.request(Pixo::Renderer::GetLedsOn.new())
70
- end
71
-
72
- def add_fadecandy(hostname, count)
73
- service.request(Pixo::Renderer::AddFadecandy.new(hostname, count), async: true)
40
+ request(Pixo::Rpc::GetLedsOn.new())
74
41
  end
75
42
 
76
- private
77
-
78
- class AddFadecandy
79
- def initialize(hostname, count)
80
- @hostname = hostname
81
- @count = count
82
- end
83
-
84
- def call(service)
85
- service.user_data.post Proc.new { |app| app.add_fadecandy(Pixo::Native::FadeCandy.new(@hostname, @count)) }
86
- self
87
- end
43
+ def add_pattern(name, code)
44
+ request(Pixo::Rpc::AddPattern.new(name, code))
88
45
  end
89
46
 
90
- class GetPatternName
91
- def call(service)
92
- service.user_data.patterns.key(service.user_data.active_pattern)
93
- end
94
- end
95
-
96
- class GetPatternNames
97
- def call(service)
98
- service.user_data.patterns.keys
99
- end
100
- end
101
-
102
- class SetPattern
103
- def initialize(pattern_name = nil)
104
- @pattern_name = pattern_name
105
- end
106
-
107
- def call(service)
108
- pattern = service.user_data.patterns[@pattern_name]
109
- service.user_data.active_pattern = pattern
110
- @pattern_name
111
- end
112
- end
113
-
114
- class GetBrightness
115
- def call(service)
116
- service.user_data.brightness
117
- end
118
- end
119
-
120
- class SetBrightness
121
- def initialize(brightness)
122
- @brightness = brightness
123
- end
124
-
125
- def call(service)
126
- service.user_data.brightness = @brightness
127
- end
128
- end
129
-
130
-
131
- class GetLedsOn
132
- def call(service)
133
- service.user_data.leds_on
134
- end
135
- end
136
-
137
- class SetLedsOn
138
- def initialize(leds_on)
139
- @leds_on = leds_on
140
- end
141
-
142
- def call(service)
143
- service.user_data.leds_on = @leds_on
144
- end
47
+ def add_fadecandy(hostname, count)
48
+ request(Pixo::Rpc::AddFadecandy.new(hostname, count))
145
49
  end
146
-
147
50
  end
148
51
  end
@@ -0,0 +1,23 @@
1
+ module Pixo::Rpc
2
+ class ApplicationService < Pixo::Rpc::Service
3
+ attr_reader :application
4
+
5
+ def initialize(reader_pipe, writer_pipe, app, latch)
6
+ super(reader_pipe, writer_pipe)
7
+ @application = app
8
+
9
+ @latch = latch
10
+ @service_thread = Thread.new { self.thread_run }
11
+ end
12
+
13
+ def thread_run
14
+ @latch.wait(10)
15
+ run
16
+ rescue
17
+ STDERR.puts $!.inspect
18
+ ensure
19
+ application.shutdown
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,114 @@
1
+ module Pixo::Rpc
2
+
3
+ class OnKey
4
+ def initialize(key, scancode, action, mods)
5
+ @key = key
6
+ @scancode = scancode
7
+ @action = action
8
+ @mods = mods
9
+ end
10
+
11
+ def call(service)
12
+ service.on_key(@key, @scancode, @action, @mods)
13
+ self
14
+ end
15
+ end
16
+
17
+ class AddPattern
18
+ def initialize(name, code)
19
+ @name = name
20
+ @code = code
21
+ end
22
+
23
+ def call(service)
24
+ result = nil
25
+ latch = Concurrent::CountDownLatch.new(1)
26
+
27
+ service.application.post( Proc.new do |app|
28
+ app.add_pattern(@name, @code)
29
+ result = @name
30
+ latch.count_down
31
+ end)
32
+ latch.wait
33
+
34
+ result
35
+ end
36
+ end
37
+
38
+ class AddFadecandy
39
+ def initialize(hostname, count)
40
+ @hostname = hostname
41
+ @count = count
42
+ end
43
+
44
+ def call(service)
45
+ result = nil
46
+ latch = Concurrent::CountDownLatch.new(1)
47
+
48
+ service.application.post( Proc.new do |app|
49
+ app.add_fadecandy(@hostname, @count)
50
+ result = @hostname
51
+ latch.count_down
52
+ end)
53
+ latch.wait
54
+
55
+ result
56
+ end
57
+ end
58
+
59
+
60
+ class ListPatterns
61
+ def call(service)
62
+ service.application.patterns.keys
63
+ end
64
+ end
65
+
66
+ class GetPattern
67
+ def call(service)
68
+ service.application.pattern
69
+ end
70
+ end
71
+
72
+ class SetPattern
73
+ def initialize(pattern_name = nil)
74
+ @pattern_name = pattern_name
75
+ end
76
+
77
+ def call(service)
78
+ service.application.pattern = @pattern_name
79
+ end
80
+ end
81
+
82
+ class GetBrightness
83
+ def call(service)
84
+ service.application.brightness
85
+ end
86
+ end
87
+
88
+ class SetBrightness
89
+ def initialize(brightness)
90
+ @brightness = brightness
91
+ end
92
+
93
+ def call(service)
94
+ service.application.brightness = @brightness
95
+ end
96
+ end
97
+
98
+
99
+ class GetLedsOn
100
+ def call(service)
101
+ service.application.leds_on
102
+ end
103
+ end
104
+
105
+ class SetLedsOn
106
+ def initialize(leds_on)
107
+ @leds_on = leds_on
108
+ end
109
+
110
+ def call(service)
111
+ service.application.leds_on = @leds_on
112
+ end
113
+ end
114
+ end
@@ -3,11 +3,9 @@ require 'securerandom'
3
3
  require 'base64'
4
4
  require 'thread'
5
5
 
6
- module Pixo::Ipc
6
+ module Pixo::Rpc
7
7
  class Service
8
- attr_reader :user_data
9
-
10
- def initialize(reader_pipe, writer_pipe, user_data: nil)
8
+ def initialize(reader_pipe, writer_pipe)
11
9
  @reader_pipe = reader_pipe
12
10
  @writer_pipe = writer_pipe
13
11
 
@@ -15,15 +13,13 @@ module Pixo::Ipc
15
13
  @live_requests = Concurrent::Hash.new
16
14
 
17
15
  @pipe_mutex = Mutex.new
18
-
19
- @user_data = user_data
20
16
  end
21
17
 
22
18
  def run
23
19
  while @running && (line = @reader_pipe.readline)
24
20
  message = Marshal.load(Base64.strict_decode64(line.strip))
25
- if message.is_a?(Pixo::Ipc::RequestMessage)
26
- resp = Pixo::Ipc::ResponseMessage.new(message.data.call(self), message.rid)
21
+ if message.is_a?(Pixo::Rpc::RequestMessage)
22
+ resp = Pixo::Rpc::ResponseMessage.new(message.data.call(self), message.rid)
27
23
 
28
24
  bytes_to_write = Base64.strict_encode64(Marshal.dump(resp))
29
25
  @pipe_mutex.synchronize do
@@ -31,7 +27,7 @@ module Pixo::Ipc
31
27
  @writer_pipe.write($/)
32
28
  @writer_pipe.flush
33
29
  end
34
- elsif message.is_a?(Pixo::Ipc::ResponseMessage)
30
+ elsif message.is_a?(Pixo::Rpc::ResponseMessage)
35
31
  @live_requests[message.rid]
36
32
  request = @live_requests[message.rid]
37
33
  request.send_result(message.data) if request
@@ -48,7 +44,7 @@ module Pixo::Ipc
48
44
  end
49
45
 
50
46
  def request(message, timeout: 10, async: false)
51
- request = Pixo::Ipc::Request.new(message)
47
+ request = Pixo::Rpc::Request.new(message)
52
48
  @live_requests[request.message.rid] = request unless async
53
49
 
54
50
  bytes_to_write = Base64.strict_encode64(Marshal.dump(request.message))
@@ -81,7 +77,7 @@ module Pixo::Ipc
81
77
  attr_reader :latch
82
78
 
83
79
  def initialize(data)
84
- @message = Pixo::Ipc::RequestMessage.new(data)
80
+ @message = Pixo::Rpc::RequestMessage.new(data)
85
81
 
86
82
  @latch = Concurrent::CountDownLatch.new(1)
87
83
  end
data/lib/pixo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pixo
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/pixo.rb CHANGED
@@ -1,8 +1,21 @@
1
1
  require "pixo/version"
2
- require "pixo/ipc/service"
2
+ require "pixo/rpc/service"
3
+ require "pixo/rpc/application_service"
4
+ require "pixo/rpc/request_types"
3
5
  require "pixo/renderer"
4
6
  require "open3"
5
7
 
6
8
  module Pixo
7
9
 
10
+ def self.seed_patterns
11
+ unless @patterns
12
+ @patterns = Hash.new
13
+ patterns_dir = File.join(File.dirname(__FILE__), "..", 'ext', 'pixo', 'patterns')
14
+ Dir.entries(patterns_dir).each do | pattern_file|
15
+ next unless pattern_file.end_with?('.glsl')
16
+ @patterns[pattern_file] = File.read(File.join(patterns_dir, pattern_file))
17
+ end
18
+ end
19
+ @patterns
20
+ end
8
21
  end
data/pixo.gemspec CHANGED
@@ -31,5 +31,6 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "rake", "~> 10.0"
32
32
  spec.add_development_dependency "rake-compiler", "~> 1.0"
33
33
  spec.add_development_dependency "rspec", ">= 3.0"
34
+ spec.add_development_dependency "rspec-collection_matchers", ">= 1.1.3"
34
35
 
35
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pixo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Constantine
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-collection_matchers
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.1.3
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.1.3
83
97
  description: Write a longer description or delete this line.
84
98
  email:
85
99
  - cconstan@gmail.com
@@ -1540,8 +1554,10 @@ files:
1540
1554
  - ext/pixo/src/opengl.h
1541
1555
  - lib/pixo.rb
1542
1556
  - lib/pixo/application.rb
1543
- - lib/pixo/ipc/service.rb
1544
1557
  - lib/pixo/renderer.rb
1558
+ - lib/pixo/rpc/application_service.rb
1559
+ - lib/pixo/rpc/request_types.rb
1560
+ - lib/pixo/rpc/service.rb
1545
1561
  - lib/pixo/version.rb
1546
1562
  - pixo.gemspec
1547
1563
  homepage: https://github.com/cconstantine