pixo 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/exe/pixo +1 -5
- data/ext/libpixgem/src/application.cpp +17 -0
- data/ext/libpixgem/src/application.hpp +4 -0
- data/ext/libpixgem/src/gem.cpp +1 -0
- data/ext/pixo/pixlib/src/renderer.cpp +3 -0
- data/lib/pixo/application.rb +27 -13
- data/lib/pixo/ipc/service.rb +16 -9
- data/lib/pixo/renderer.rb +55 -22
- data/lib/pixo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b6f02aec4edb8967668a68b0e5e82d06989a41a
|
4
|
+
data.tar.gz: e7722d6196838c3dc7f3e8c15f04318737f161b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 901ba8065c211abf4e5382139e279ee315befbe652d0743e2bd61816f2984fe20da791f0bd9fbedd601346e234c6c3ffd02f11c08354b306418df282fa97f81d
|
7
|
+
data.tar.gz: 4a6474b8ea8552582c4e6509debc6bd93e2f884d399f54d274765aa4ecd02da7fd793bb07f891af6a4084a769ecce12c7bb2d2281993502ffc0a44814874aa54
|
data/Gemfile.lock
CHANGED
data/exe/pixo
CHANGED
@@ -3,12 +3,8 @@
|
|
3
3
|
require 'pixo'
|
4
4
|
require 'pixo/application'
|
5
5
|
|
6
|
-
app = Pixo::Application.
|
6
|
+
app = Pixo::Application.new
|
7
7
|
|
8
|
-
service_thread = Thread.new do
|
9
|
-
Pixo::Ipc::Service.new(STDIN, STDOUT).run
|
10
|
-
app.shutdown
|
11
|
-
end
|
12
8
|
Signal.trap('INT') { app.shutdown }
|
13
9
|
Signal.trap('TERM') { app.shutdown }
|
14
10
|
|
@@ -78,6 +78,8 @@ VALUE application_initialize(VALUE self)
|
|
78
78
|
ApplicationHolder * holder;
|
79
79
|
|
80
80
|
Data_Get_Struct(self, ApplicationHolder, holder);
|
81
|
+
|
82
|
+
holder->self = self;
|
81
83
|
|
82
84
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
83
85
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
@@ -101,9 +103,24 @@ VALUE application_initialize(VALUE self)
|
|
101
103
|
}
|
102
104
|
|
103
105
|
holder->app = new App();
|
106
|
+
glfwSetWindowUserPointer(holder->window, holder);
|
107
|
+
|
108
|
+
glfwSetKeyCallback(holder->window,
|
109
|
+
[](GLFWwindow *window, int key, int scancode, int action, int mods) {
|
110
|
+
if (action == GLFW_REPEAT) {
|
111
|
+
return;
|
112
|
+
}
|
113
|
+
|
114
|
+
ApplicationHolder *holder = (ApplicationHolder *)glfwGetWindowUserPointer(window);
|
115
|
+
|
116
|
+
rb_funcall(holder->self, rb_intern("key_callback"), 4, INT2NUM(key), INT2NUM(scancode), INT2NUM(action), INT2NUM(mods));
|
117
|
+
});
|
104
118
|
return self;
|
105
119
|
}
|
106
120
|
|
121
|
+
VALUE application_key_callback(VALUE self, VALUE key, VALUE scancode, VALUE action, VALUE mods)
|
122
|
+
{ }
|
123
|
+
|
107
124
|
VALUE application_tick(VALUE self, VALUE r_pattern, VALUE r_brightness)
|
108
125
|
{
|
109
126
|
GLenum glErr;
|
@@ -17,10 +17,14 @@ public:
|
|
17
17
|
GLFWwindow* window;
|
18
18
|
|
19
19
|
std::vector<VALUE> fade_candies;
|
20
|
+
|
21
|
+
VALUE self;
|
20
22
|
};
|
21
23
|
|
22
24
|
VALUE application_allocate(VALUE klass);
|
23
25
|
|
26
|
+
VALUE application_key_callback(VALUE self, VALUE key, VALUE scancode, VALUE action, VALUE mods);
|
27
|
+
|
24
28
|
VALUE application_close(VALUE self);
|
25
29
|
|
26
30
|
VALUE application_initialize(VALUE self);
|
data/ext/libpixgem/src/gem.cpp
CHANGED
@@ -46,6 +46,7 @@ extern "C" void Init_libpixgem() {
|
|
46
46
|
rb_define_method(ApplicationClass, "initialize", (VALUE(*)(ANYARGS))application_initialize, 0);
|
47
47
|
rb_define_method(ApplicationClass, "close", (VALUE(*)(ANYARGS))application_close, 0);
|
48
48
|
rb_define_method(ApplicationClass, "tick", (VALUE(*)(ANYARGS))application_tick, 2);
|
49
|
+
rb_define_method(ApplicationClass, "key_callback", (VALUE(*)(ANYARGS))application_key_callback, 4);
|
49
50
|
rb_define_method(ApplicationClass, "add_fadecandy", (VALUE(*)(ANYARGS))application_add_fadecandy, 1);
|
50
51
|
|
51
52
|
VALUE FadeCandyClass = rb_define_class_under(Native, "FadeCandy", rb_cObject);
|
@@ -23,6 +23,7 @@ namespace Pixlib {
|
|
23
23
|
|
24
24
|
out vec2 TexCoords;
|
25
25
|
out vec3 Normal;
|
26
|
+
out vec4 Position;
|
26
27
|
|
27
28
|
uniform mat4 view;
|
28
29
|
uniform mat4 projection;
|
@@ -34,6 +35,7 @@ namespace Pixlib {
|
|
34
35
|
gl_Position = projection * view * positionOffset * vec4(position, 1.0f);
|
35
36
|
TexCoords = texCoords + texCoordsOffset;
|
36
37
|
Normal = normal;
|
38
|
+
Position = positionOffset*vec4(position, 1.0f);
|
37
39
|
})",
|
38
40
|
R"(#version 330 core
|
39
41
|
|
@@ -42,6 +44,7 @@ namespace Pixlib {
|
|
42
44
|
#endif
|
43
45
|
|
44
46
|
in vec2 TexCoords;
|
47
|
+
in vec3 Position;
|
45
48
|
|
46
49
|
out vec4 color;
|
47
50
|
|
data/lib/pixo/application.rb
CHANGED
@@ -7,11 +7,29 @@ module Pixo
|
|
7
7
|
class Application < Pixo::Native::Application
|
8
8
|
attr_accessor :running, :leds_on
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def initialize()
|
11
|
+
super
|
12
|
+
self.running = false
|
13
|
+
self.brightness = 1.0
|
14
|
+
self.leds_on = true
|
15
|
+
@procs = Array.new
|
16
|
+
|
17
|
+
@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
|
12
28
|
end
|
13
29
|
|
14
30
|
def run
|
31
|
+
self.running = tick(active_pattern, brightness)
|
32
|
+
|
15
33
|
while(running)
|
16
34
|
@procs_lock.synchronize {
|
17
35
|
@procs.each {|proc| proc.call(self) }
|
@@ -29,12 +47,14 @@ module Pixo
|
|
29
47
|
end
|
30
48
|
|
31
49
|
def post(proc)
|
32
|
-
|
33
50
|
@procs_lock.synchronize {
|
34
51
|
@procs << proc
|
35
52
|
}
|
36
53
|
end
|
37
54
|
|
55
|
+
def key_callback(key, scancode, action, mods)
|
56
|
+
@service.request(Pixo::Renderer::OnKey.new(key, scancode, action, mods))
|
57
|
+
end
|
38
58
|
|
39
59
|
def patterns
|
40
60
|
unless @patterns
|
@@ -74,18 +94,12 @@ module Pixo
|
|
74
94
|
leds_on ? @brightness : 0.0
|
75
95
|
end
|
76
96
|
|
77
|
-
|
97
|
+
private
|
98
|
+
|
78
99
|
|
79
|
-
def initialize()
|
80
|
-
super
|
81
|
-
self.running = true
|
82
|
-
self.brightness = 1.0
|
83
|
-
self.leds_on = true
|
84
|
-
@procs = Array.new
|
85
100
|
|
86
|
-
@procs_lock = Mutex.new
|
87
|
-
#
|
88
|
-
end
|
89
101
|
end
|
102
|
+
|
103
|
+
|
90
104
|
end
|
91
105
|
|
data/lib/pixo/ipc/service.rb
CHANGED
@@ -5,21 +5,25 @@ require 'thread'
|
|
5
5
|
|
6
6
|
module Pixo::Ipc
|
7
7
|
class Service
|
8
|
+
attr_reader :user_data
|
8
9
|
|
9
|
-
def initialize(reader_pipe, writer_pipe)
|
10
|
+
def initialize(reader_pipe, writer_pipe, user_data: nil)
|
10
11
|
@reader_pipe = reader_pipe
|
11
12
|
@writer_pipe = writer_pipe
|
13
|
+
|
12
14
|
@running = true
|
13
15
|
@live_requests = Concurrent::Hash.new
|
14
16
|
|
15
17
|
@pipe_mutex = Mutex.new
|
18
|
+
|
19
|
+
@user_data = user_data
|
16
20
|
end
|
17
21
|
|
18
22
|
def run
|
19
23
|
while @running && (line = @reader_pipe.readline)
|
20
24
|
message = Marshal.load(Base64.strict_decode64(line.strip))
|
21
25
|
if message.is_a?(Pixo::Ipc::RequestMessage)
|
22
|
-
resp = Pixo::Ipc::ResponseMessage.new(message.data.call, message.rid)
|
26
|
+
resp = Pixo::Ipc::ResponseMessage.new(message.data.call(self), message.rid)
|
23
27
|
|
24
28
|
bytes_to_write = Base64.strict_encode64(Marshal.dump(resp))
|
25
29
|
@pipe_mutex.synchronize do
|
@@ -33,8 +37,8 @@ module Pixo::Ipc
|
|
33
37
|
request.send_result(message.data) if request
|
34
38
|
end
|
35
39
|
end
|
36
|
-
rescue EOFError
|
37
|
-
rescue IOError
|
40
|
+
rescue EOFError => e
|
41
|
+
rescue IOError => e
|
38
42
|
end
|
39
43
|
|
40
44
|
def shutdown
|
@@ -43,16 +47,19 @@ module Pixo::Ipc
|
|
43
47
|
@writer_pipe.close
|
44
48
|
end
|
45
49
|
|
46
|
-
def request(message, timeout:
|
50
|
+
def request(message, timeout: 10)
|
47
51
|
request = Pixo::Ipc::Request.new(message)
|
48
52
|
@live_requests[request.message.rid] = request
|
49
53
|
|
50
|
-
|
51
|
-
@
|
52
|
-
|
54
|
+
bytes_to_write = Base64.strict_encode64(Marshal.dump(request.message))
|
55
|
+
@pipe_mutex.synchronize do
|
56
|
+
@writer_pipe.write(bytes_to_write)
|
57
|
+
@writer_pipe.write($/)
|
58
|
+
@writer_pipe.flush
|
59
|
+
end
|
53
60
|
|
54
61
|
unless request.latch.wait(timeout)
|
55
|
-
raise Timeout::Error.new("%s: request timed out after %.3f seconds." % [request.rid, timeout] )
|
62
|
+
raise Timeout::Error.new("%s: request timed out after %.3f seconds." % [request.message.rid, timeout] )
|
56
63
|
end
|
57
64
|
|
58
65
|
return request.response
|
data/lib/pixo/renderer.rb
CHANGED
@@ -2,10 +2,43 @@ module Pixo
|
|
2
2
|
class Renderer
|
3
3
|
attr_reader :service, :service_thread
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@service = Pixo::Renderer::Service.new(self)
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_key(key, scancode, action, mods)
|
41
|
+
|
9
42
|
end
|
10
43
|
|
11
44
|
def pattern_names
|
@@ -48,39 +81,39 @@ module Pixo
|
|
48
81
|
@count = count
|
49
82
|
end
|
50
83
|
|
51
|
-
def call
|
52
|
-
|
84
|
+
def call(service)
|
85
|
+
service.user_data.post Proc.new { |app| app.add_fadecandy(Pixo::Native::FadeCandy.new(@hostname, @count)) }
|
53
86
|
self
|
54
87
|
end
|
55
88
|
end
|
56
89
|
|
57
90
|
class GetPatternName
|
58
|
-
def call
|
59
|
-
|
91
|
+
def call(service)
|
92
|
+
service.user_data.patterns.key(service.user_data.active_pattern)
|
60
93
|
end
|
61
94
|
end
|
62
95
|
|
63
96
|
class GetPatternNames
|
64
|
-
def call
|
65
|
-
|
97
|
+
def call(service)
|
98
|
+
service.user_data.patterns.keys
|
66
99
|
end
|
67
100
|
end
|
68
101
|
|
69
102
|
class SetPattern
|
70
|
-
def initialize(pattern_name)
|
103
|
+
def initialize(pattern_name = nil)
|
71
104
|
@pattern_name = pattern_name
|
72
105
|
end
|
73
106
|
|
74
|
-
def call
|
75
|
-
pattern =
|
76
|
-
|
107
|
+
def call(service)
|
108
|
+
pattern = service.user_data.patterns[@pattern_name]
|
109
|
+
service.user_data.active_pattern = pattern
|
77
110
|
@pattern_name
|
78
111
|
end
|
79
112
|
end
|
80
113
|
|
81
114
|
class GetBrightness
|
82
|
-
def call
|
83
|
-
|
115
|
+
def call(service)
|
116
|
+
service.user_data.brightness
|
84
117
|
end
|
85
118
|
end
|
86
119
|
|
@@ -89,15 +122,15 @@ module Pixo
|
|
89
122
|
@brightness = brightness
|
90
123
|
end
|
91
124
|
|
92
|
-
def call
|
93
|
-
|
125
|
+
def call(service)
|
126
|
+
service.user_data.brightness = @brightness
|
94
127
|
end
|
95
128
|
end
|
96
129
|
|
97
130
|
|
98
131
|
class GetLedsOn
|
99
|
-
def call
|
100
|
-
|
132
|
+
def call(service)
|
133
|
+
service.user_data.leds_on
|
101
134
|
end
|
102
135
|
end
|
103
136
|
|
@@ -106,8 +139,8 @@ module Pixo
|
|
106
139
|
@leds_on = leds_on
|
107
140
|
end
|
108
141
|
|
109
|
-
def call
|
110
|
-
|
142
|
+
def call(service)
|
143
|
+
service.user_data.leds_on = @leds_on
|
111
144
|
end
|
112
145
|
end
|
113
146
|
|
data/lib/pixo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pixo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
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-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|