pixo 0.2.0 → 0.2.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +18 -1
- data/exe/pixo +9 -1
- data/lib/pixo/application.rb +61 -0
- data/lib/pixo/ipc/service.rb +108 -0
- data/lib/pixo/version.rb +1 -1
- data/lib/pixo.rb +28 -59
- data/pixo.gemspec +3 -0
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8aa1f77b18b26d4780cb42129a19d2d287001a9a
|
4
|
+
data.tar.gz: 7029163344d64ce5696b5f6aca011662c2f1b665
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0925db69c959cf66caac3972316390f9539f54d81db691dd3079d27a354cfc79223726be2715c0e90f4b737cd2284581c2530a5aa5e7912511cd021977eb4360'
|
7
|
+
data.tar.gz: 5e109416c55cf554aa8c9125402a6bef21fd86f51d8ca22e679b3620bd892e0aaf2f385ab3cab2528ba8431a2a1495941b5146fe4d53c4c72654eebddd2cf57c
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,30 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pixo (0.2.
|
4
|
+
pixo (0.2.1)
|
5
|
+
concurrent-ruby
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: https://rubygems.org/
|
8
9
|
specs:
|
10
|
+
concurrent-ruby (1.0.5)
|
11
|
+
diff-lcs (1.3)
|
9
12
|
rake (10.5.0)
|
10
13
|
rake-compiler (1.0.4)
|
11
14
|
rake
|
15
|
+
rspec (3.6.0)
|
16
|
+
rspec-core (~> 3.6.0)
|
17
|
+
rspec-expectations (~> 3.6.0)
|
18
|
+
rspec-mocks (~> 3.6.0)
|
19
|
+
rspec-core (3.6.0)
|
20
|
+
rspec-support (~> 3.6.0)
|
21
|
+
rspec-expectations (3.6.0)
|
22
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
23
|
+
rspec-support (~> 3.6.0)
|
24
|
+
rspec-mocks (3.6.0)
|
25
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
26
|
+
rspec-support (~> 3.6.0)
|
27
|
+
rspec-support (3.6.0)
|
12
28
|
|
13
29
|
PLATFORMS
|
14
30
|
ruby
|
@@ -18,6 +34,7 @@ DEPENDENCIES
|
|
18
34
|
pixo!
|
19
35
|
rake (~> 10.0)
|
20
36
|
rake-compiler (~> 1.0)
|
37
|
+
rspec (>= 3.0)
|
21
38
|
|
22
39
|
BUNDLED WITH
|
23
40
|
1.15.4
|
data/exe/pixo
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'pixo'
|
4
|
+
require 'pixo/application'
|
4
5
|
|
5
|
-
|
6
|
+
|
7
|
+
service_thread = Thread.new do
|
8
|
+
sleep 0.1
|
9
|
+
Pixo::Ipc::Service.new(STDIN, STDOUT).run
|
10
|
+
Pixo::Application.instance.shutdown
|
11
|
+
end
|
12
|
+
|
13
|
+
Pixo::Application.instance.run
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
require File.expand_path('../../libpixgem', __FILE__)
|
5
|
+
|
6
|
+
module Pixo
|
7
|
+
class Application < Pixo::Native::Application
|
8
|
+
attr_accessor :running
|
9
|
+
|
10
|
+
def self.instance
|
11
|
+
@instance ||= Pixo::Application.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
while(running)
|
16
|
+
self.running = tick(active_pattern) && running
|
17
|
+
end
|
18
|
+
close
|
19
|
+
end
|
20
|
+
|
21
|
+
def shutdown
|
22
|
+
self.running = false
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def patterns
|
27
|
+
unless @patterns
|
28
|
+
@patterns = Hash.new
|
29
|
+
patterns_dir = File.join(File.dirname(__FILE__), "..", "..", 'ext', 'pixo', 'patterns')
|
30
|
+
Dir.entries(patterns_dir).each do | pattern_file|
|
31
|
+
next unless pattern_file.end_with?('.glsl')
|
32
|
+
@patterns[pattern_file] = Pixo::Native::Pattern.new(File.read(File.join(patterns_dir, pattern_file)))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
@patterns
|
36
|
+
end
|
37
|
+
|
38
|
+
def active_pattern
|
39
|
+
@active_pattern ||= random_pattern
|
40
|
+
end
|
41
|
+
|
42
|
+
def random_pattern
|
43
|
+
patterns[patterns.keys.sample]
|
44
|
+
end
|
45
|
+
|
46
|
+
def active_pattern=(pattern)
|
47
|
+
pattern.reset_start
|
48
|
+
@active_pattern = pattern
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def initialize()
|
54
|
+
super
|
55
|
+
self.running = true
|
56
|
+
|
57
|
+
add_fadecandy(Pixo::Native::FadeCandy.new('localhost', 8))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'concurrent'
|
2
|
+
require 'securerandom'
|
3
|
+
require 'base64'
|
4
|
+
require 'thread'
|
5
|
+
|
6
|
+
module Pixo::Ipc
|
7
|
+
class Service
|
8
|
+
|
9
|
+
def initialize(reader_pipe, writer_pipe)
|
10
|
+
@reader_pipe = reader_pipe
|
11
|
+
@writer_pipe = writer_pipe
|
12
|
+
@running = true
|
13
|
+
@live_requests = Concurrent::Hash.new
|
14
|
+
|
15
|
+
@pipe_mutex = Mutex.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
while @running && (line = @reader_pipe.readline)
|
20
|
+
message = Marshal.load(Base64.strict_decode64(line.strip))
|
21
|
+
if message.is_a?(Pixo::Ipc::RequestMessage)
|
22
|
+
resp = Pixo::Ipc::ResponseMessage.new(message.data.call, message.rid)
|
23
|
+
|
24
|
+
bytes_to_write = Base64.strict_encode64(Marshal.dump(resp))
|
25
|
+
@pipe_mutex.synchronize do
|
26
|
+
@writer_pipe.write(bytes_to_write)
|
27
|
+
@writer_pipe.write($/)
|
28
|
+
@writer_pipe.flush
|
29
|
+
end
|
30
|
+
elsif message.is_a?(Pixo::Ipc::ResponseMessage)
|
31
|
+
@live_requests[message.rid]
|
32
|
+
request = @live_requests[message.rid]
|
33
|
+
request.send_result(message.data) if request
|
34
|
+
end
|
35
|
+
end
|
36
|
+
rescue EOFError
|
37
|
+
rescue IOError
|
38
|
+
end
|
39
|
+
|
40
|
+
def shutdown
|
41
|
+
@running = false
|
42
|
+
@reader_pipe.close
|
43
|
+
@writer_pipe.close
|
44
|
+
end
|
45
|
+
|
46
|
+
def request(message, timeout: nil)
|
47
|
+
request = Pixo::Ipc::Request.new(message)
|
48
|
+
@live_requests[request.message.rid] = request
|
49
|
+
|
50
|
+
@writer_pipe.write(Base64.strict_encode64(Marshal.dump(request.message)))
|
51
|
+
@writer_pipe.write($/)
|
52
|
+
@writer_pipe.flush
|
53
|
+
|
54
|
+
unless request.latch.wait(timeout)
|
55
|
+
raise Timeout::Error.new("%s: request timed out after %.3f seconds." % [request.rid, timeout] )
|
56
|
+
end
|
57
|
+
|
58
|
+
return request.response
|
59
|
+
ensure
|
60
|
+
@live_requests.delete request.message.rid
|
61
|
+
end
|
62
|
+
|
63
|
+
def live_request_count
|
64
|
+
@live_requests.count
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class Request
|
69
|
+
attr_accessor :message
|
70
|
+
|
71
|
+
attr_reader :response
|
72
|
+
attr_reader :latch
|
73
|
+
|
74
|
+
def initialize(data)
|
75
|
+
@message = Pixo::Ipc::RequestMessage.new(data)
|
76
|
+
|
77
|
+
@latch = Concurrent::CountDownLatch.new(1)
|
78
|
+
end
|
79
|
+
|
80
|
+
def send_result(result)
|
81
|
+
@response = result
|
82
|
+
@latch.count_down
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class Message
|
87
|
+
attr_accessor :data
|
88
|
+
attr_reader :rid
|
89
|
+
|
90
|
+
def initialize(data)
|
91
|
+
@data = data
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class RequestMessage < Message
|
96
|
+
def initialize(data)
|
97
|
+
super(data)
|
98
|
+
@rid = "rid_#{SecureRandom.hex(10)}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class ResponseMessage < Message
|
103
|
+
def initialize(data, rid)
|
104
|
+
@data = data
|
105
|
+
@rid = rid
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/pixo/version.rb
CHANGED
data/lib/pixo.rb
CHANGED
@@ -1,82 +1,51 @@
|
|
1
1
|
require "pixo/version"
|
2
|
+
require "pixo/ipc/service"
|
2
3
|
require "open3"
|
3
|
-
require 'benchmark'
|
4
|
-
require 'base64'
|
5
|
-
|
6
|
-
require File.expand_path('../libpixgem', __FILE__)
|
7
4
|
|
8
5
|
module Pixo
|
9
|
-
class
|
10
|
-
|
11
|
-
|
12
|
-
self.render_ms = render_ms
|
6
|
+
class GetPatternName
|
7
|
+
def call
|
8
|
+
Pixo::Application.instance.patterns.key(Pixo::Application.instance.active_pattern)
|
13
9
|
end
|
14
10
|
end
|
15
|
-
|
16
|
-
class
|
17
|
-
|
18
|
-
|
19
|
-
Open3.popen3('bundle exec pixo') do |i, o, e, t|
|
20
|
-
while line = o.readline
|
21
|
-
|
22
|
-
block.call(Marshal.load(Base64.strict_decode64(line.strip)))
|
23
|
-
end
|
24
|
-
end
|
11
|
+
|
12
|
+
class GetPatternNames
|
13
|
+
def call
|
14
|
+
Pixo::Application.instance.patterns.keys
|
25
15
|
end
|
26
16
|
end
|
27
17
|
|
28
|
-
class
|
29
|
-
|
30
|
-
|
31
|
-
def initialize()
|
32
|
-
super
|
33
|
-
self.running = true
|
34
|
-
|
35
|
-
add_fadecandy(Pixo::Native::FadeCandy.new('localhost', 8))
|
18
|
+
class SetPattern
|
19
|
+
def initialize(pattern_name)
|
20
|
+
@pattern_name = pattern_name
|
36
21
|
end
|
37
|
-
|
38
|
-
def run
|
39
|
-
while(running)
|
40
|
-
render_ms = Benchmark.realtime do
|
41
|
-
running = tick(active_pattern) && running
|
42
|
-
end
|
43
|
-
|
44
|
-
stats = Pixo::FrameStatus.new(render_ms)
|
45
|
-
STDOUT.write(Base64.strict_encode64(Marshal.dump(stats)))
|
46
|
-
STDOUT.write($/)
|
47
|
-
STDOUT.flush
|
48
22
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
close
|
23
|
+
def call
|
24
|
+
pattern = Pixo::Application.instance.patterns[@pattern_name]
|
25
|
+
Pixo::Application.instance.active_pattern = pattern if pattern
|
26
|
+
@pattern_name
|
54
27
|
end
|
28
|
+
end
|
55
29
|
|
30
|
+
class Renderer
|
31
|
+
attr_reader :service, :service_thread
|
56
32
|
|
57
|
-
def
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
Dir.entries(patterns_dir).each do | pattern_file|
|
62
|
-
next unless pattern_file.end_with?('.glsl')
|
63
|
-
@patterns[pattern_file] = Pixo::Native::Pattern.new(File.read(File.join(patterns_dir, pattern_file)))
|
64
|
-
end
|
65
|
-
end
|
66
|
-
@patterns
|
33
|
+
def initialize()
|
34
|
+
i, o, t = Open3.popen2('bundle exec pixo')
|
35
|
+
@service = Pixo::Ipc::Service.new(o, i)
|
36
|
+
@service_thread = Thread.new { self.service.run }
|
67
37
|
end
|
68
38
|
|
69
|
-
def
|
70
|
-
|
39
|
+
def pattern_names
|
40
|
+
service.request(Pixo::GetPatternNames.new)
|
71
41
|
end
|
72
42
|
|
73
|
-
def
|
74
|
-
|
43
|
+
def active_pattern
|
44
|
+
service.request(Pixo::GetPatternName.new)
|
75
45
|
end
|
76
46
|
|
77
|
-
def
|
78
|
-
|
79
|
-
@active_pattern = pattern
|
47
|
+
def set_pattern(name)
|
48
|
+
service.request(Pixo::SetPattern.new(name))
|
80
49
|
end
|
81
50
|
end
|
82
51
|
end
|
data/pixo.gemspec
CHANGED
@@ -25,8 +25,11 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
26
|
spec.require_paths = ["lib"]
|
27
27
|
|
28
|
+
spec.add_dependency "concurrent-ruby"
|
29
|
+
|
28
30
|
spec.add_development_dependency "bundler", "~> 1.15"
|
29
31
|
spec.add_development_dependency "rake", "~> 10.0"
|
30
32
|
spec.add_development_dependency "rake-compiler", "~> 1.0"
|
33
|
+
spec.add_development_dependency "rspec", ">= 3.0"
|
31
34
|
|
32
35
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pixo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Constantine
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: concurrent-ruby
|
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'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '1.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: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
55
83
|
description: Write a longer description or delete this line.
|
56
84
|
email:
|
57
85
|
- cconstan@gmail.com
|
@@ -1511,6 +1539,8 @@ files:
|
|
1511
1539
|
- ext/pixo/src/main.cpp
|
1512
1540
|
- ext/pixo/src/opengl.h
|
1513
1541
|
- lib/pixo.rb
|
1542
|
+
- lib/pixo/application.rb
|
1543
|
+
- lib/pixo/ipc/service.rb
|
1514
1544
|
- lib/pixo/version.rb
|
1515
1545
|
- pixo.gemspec
|
1516
1546
|
homepage: https://github.com/cconstantine
|