pixo 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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