tamashii-agent 0.2.5 → 0.2.6
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/lib/tamashii/agent/config.rb +3 -0
- data/lib/tamashii/agent/device/fake_lcd.rb +6 -5
- data/lib/tamashii/agent/device/lcd.rb +7 -2
- data/lib/tamashii/agent/lcd.rb +130 -17
- data/lib/tamashii/agent/version.rb +1 -1
- data/tamashii-agent.gemspec +2 -1
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8472e90c77ca68d4a0d15db970fb273fb389062d
|
4
|
+
data.tar.gz: db69d53412c00a2b54a31a3e6a6ea890c60e1492
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6a316a2e7a50933e92d8a98c2ef747f47d7c8b1b0d670f165367ee061f2fde511487adeffe5976b39e40f0b077e11262e2d4a0c697242e6c973024831e4675d
|
7
|
+
data.tar.gz: 5d41b33314386e86365764565e64c6031248b29e6313bac7d251ccad4051b3aa3a1a07a9ddf93fac9ae3af3d69d2c8c838821c5ff5ff5f1168889d27704366ea
|
@@ -12,8 +12,11 @@ module Tamashii
|
|
12
12
|
register :manager_port, 3000
|
13
13
|
register :connection_timeout, 3
|
14
14
|
|
15
|
+
register :localtime, "+08:00"
|
16
|
+
|
15
17
|
register :lcd_path, '/dev/i2c-1'
|
16
18
|
register :lcd_address, 0x27
|
19
|
+
register :lcd_animation_delay, 1
|
17
20
|
|
18
21
|
def auth_type(type = nil)
|
19
22
|
return @auth_type ||= :none if type.nil?
|
@@ -3,7 +3,9 @@ module Tamashii
|
|
3
3
|
module Device
|
4
4
|
# :nodoc:
|
5
5
|
class FakeLCD
|
6
|
+
include Common::Loggable
|
6
7
|
WIDTH = 16
|
8
|
+
LINE_COUNT = 2
|
7
9
|
|
8
10
|
attr_accessor :backlight
|
9
11
|
|
@@ -13,16 +15,15 @@ module Tamashii
|
|
13
15
|
|
14
16
|
def print_message(message)
|
15
17
|
lines = message.lines.map{|l| l.delete("\n")}
|
16
|
-
|
17
|
-
|
18
|
+
logger.info "LCD Display(BACKLIGHT: #{@backlight}):"
|
19
|
+
lines.take(LINE_COUNT).each_with_index { |line_text, line| print_line(line_text, line) }
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
def print_line(message)
|
22
|
+
def print_line(message, line)
|
23
23
|
message = '' unless message
|
24
24
|
message = message.ljust(WIDTH, ' ')
|
25
25
|
message.split('').take(WIDTH).join('')
|
26
|
+
logger.info "Line #{line}: #{message}"
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
@@ -6,6 +6,7 @@ module Tamashii
|
|
6
6
|
# :nodoc:
|
7
7
|
class LCD
|
8
8
|
WIDTH = 16
|
9
|
+
LINE_COUNT = 2
|
9
10
|
|
10
11
|
OP_CHR = 1
|
11
12
|
OP_CMD = 0
|
@@ -41,7 +42,11 @@ module Tamashii
|
|
41
42
|
|
42
43
|
def print_message(message)
|
43
44
|
lines = message.lines.map{|l| l.delete("\n")}
|
44
|
-
|
45
|
+
LINE_COUNT.times.each { |line| print_line(lines[line], line) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def print_line(message, line)
|
49
|
+
write_line(message, LINES[line])
|
45
50
|
end
|
46
51
|
|
47
52
|
private
|
@@ -51,7 +56,7 @@ module Tamashii
|
|
51
56
|
BACKLIGHT_OFF
|
52
57
|
end
|
53
58
|
|
54
|
-
def
|
59
|
+
def write_line(message, line)
|
55
60
|
message = '' unless message
|
56
61
|
message = message.ljust(WIDTH, ' ')
|
57
62
|
byte(line, OP_CMD)
|
data/lib/tamashii/agent/lcd.rb
CHANGED
@@ -5,20 +5,90 @@ require 'tamashii/agent/event'
|
|
5
5
|
require 'tamashii/agent/adapter/lcd'
|
6
6
|
|
7
7
|
|
8
|
-
|
9
8
|
module Tamashii
|
10
9
|
module Agent
|
11
10
|
class LCD < Component
|
11
|
+
|
12
|
+
class LineAnimator
|
13
|
+
include Common::Loggable
|
14
|
+
attr_reader :text
|
15
|
+
|
16
|
+
def self.line_width=(value)
|
17
|
+
@@line_width = value
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.handler_print_line=(value)
|
21
|
+
@@handler_print_line = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(line)
|
25
|
+
@line = line
|
26
|
+
@text = ""
|
27
|
+
@pos = -1
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_text(text)
|
31
|
+
return if text == @text
|
32
|
+
stop_animation
|
33
|
+
@text = text || ""
|
34
|
+
if @text.size > @@line_width
|
35
|
+
start_animation
|
36
|
+
else
|
37
|
+
print_text(@text)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def animation_show_text
|
42
|
+
text = @text[@pos, @@line_width]
|
43
|
+
@pos += 1
|
44
|
+
@pos = 0 if @pos > @max_pos
|
45
|
+
print_text(text)
|
46
|
+
end
|
47
|
+
|
48
|
+
def start_animation
|
49
|
+
@pos = 0
|
50
|
+
@max_pos = @text.size - @@line_width
|
51
|
+
logger.debug "Start animation for line #{@line}: #{@text}"
|
52
|
+
@animation_thread = Thread.new { animation_loop }
|
53
|
+
end
|
54
|
+
|
55
|
+
def animation_loop
|
56
|
+
loop do
|
57
|
+
sleep Config.lcd_animation_delay
|
58
|
+
animation_show_text
|
59
|
+
sleep 1 if @pos == 0 || @pos == @max_pos
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def stop_animation
|
64
|
+
@animation_thread.exit if @animation_thread
|
65
|
+
@animation_thread = nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def print_text(text)
|
69
|
+
@@handler_print_line&.call(text, @line)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
12
73
|
def initialize(master)
|
13
74
|
super
|
14
75
|
load_lcd_device
|
76
|
+
@device_line_count = @lcd.class::LINE_COUNT
|
15
77
|
@device_lock = Mutex.new
|
16
|
-
|
78
|
+
create_line_animators
|
79
|
+
set_idle_text("[Tamashii]\nIdle...")
|
17
80
|
logger.debug "Using LCD instance: #{@lcd.class}"
|
18
|
-
|
81
|
+
print_message("Initializing\nPlease wait...")
|
19
82
|
schedule_to_print_idle
|
20
83
|
end
|
21
84
|
|
85
|
+
def create_line_animators
|
86
|
+
LineAnimator.line_width = @lcd.class::WIDTH
|
87
|
+
LineAnimator.handler_print_line = method(:print_line)
|
88
|
+
@line_animators = []
|
89
|
+
@device_line_count.times {|i| @line_animators << LineAnimator.new(i)}
|
90
|
+
end
|
91
|
+
|
22
92
|
def load_lcd_device
|
23
93
|
@lcd = Adapter::LCD.object
|
24
94
|
rescue => e
|
@@ -27,14 +97,64 @@ module Tamashii
|
|
27
97
|
@lcd = Adapter::LCD.fake_class.new
|
28
98
|
end
|
29
99
|
|
100
|
+
def print_message(message)
|
101
|
+
lines = message.lines.map{|l| l.delete("\n")}
|
102
|
+
@device_line_count.times do |line_count|
|
103
|
+
@line_animators[line_count].set_text(lines[line_count])
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def print_line(*args)
|
108
|
+
@device_lock.synchronize do
|
109
|
+
@lcd.print_line(*args)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def set_idle_text(text)
|
114
|
+
@idle_text_raw = text
|
115
|
+
@auto_update_interval = 0
|
116
|
+
# Time hint
|
117
|
+
if @idle_text_raw.include?(Tamashii::AgentHint::TIME)
|
118
|
+
@has_time_hint = true
|
119
|
+
@auto_update_interval = [@auto_update_interval, 30].max
|
120
|
+
else
|
121
|
+
@has_time_hint = false
|
122
|
+
end
|
123
|
+
# clear auto update timer
|
124
|
+
@idle_text_timer_task.shutdown if @idle_text_timer_task
|
125
|
+
if @auto_update_interval > 0
|
126
|
+
setup_idle_text_auto_update
|
127
|
+
else
|
128
|
+
# one-time setup
|
129
|
+
compute_idle_text
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def setup_idle_text_auto_update
|
134
|
+
@idle_text_timer_task = Concurrent::TimerTask.new(run_now: true) do
|
135
|
+
compute_idle_text
|
136
|
+
print_idle
|
137
|
+
end
|
138
|
+
@idle_text_timer_task.execution_interval = @auto_update_interval
|
139
|
+
@idle_text_timer_task.timeout_interval = @auto_update_interval
|
140
|
+
@idle_text_timer_task.execute
|
141
|
+
end
|
142
|
+
|
143
|
+
def compute_idle_text
|
144
|
+
result = @idle_text_raw.clone
|
145
|
+
if @has_time_hint
|
146
|
+
result.gsub!(Tamashii::AgentHint::TIME, Time.now.localtime(Config.localtime).strftime("%m/%d(%a) %H:%M"))
|
147
|
+
end
|
148
|
+
@idle_text = result
|
149
|
+
logger.debug "Idle text updated to #{@idle_text}"
|
150
|
+
end
|
151
|
+
|
30
152
|
def schedule_to_print_idle(delay = 5)
|
31
153
|
@back_to_idle_task = Concurrent::ScheduledTask.execute(delay, &method(:print_idle))
|
32
154
|
end
|
33
155
|
|
34
156
|
def print_idle
|
35
|
-
@
|
36
|
-
@lcd.print_message(@idle_message)
|
37
|
-
end
|
157
|
+
print_message(@idle_text)
|
38
158
|
end
|
39
159
|
|
40
160
|
def process_event(event)
|
@@ -42,23 +162,19 @@ module Tamashii
|
|
42
162
|
when Event::LCD_MESSAGE
|
43
163
|
logger.debug "Show message: #{event.body}"
|
44
164
|
@back_to_idle_task&.cancel
|
165
|
+
print_message(event.body)
|
45
166
|
@device_lock.synchronize do
|
46
|
-
@lcd.print_message(event.body)
|
47
167
|
schedule_to_print_idle
|
48
168
|
end
|
49
169
|
when Event::LCD_SET_IDLE_TEXT
|
50
170
|
logger.debug "Idle text set to #{event.body}"
|
51
|
-
|
52
|
-
|
53
|
-
@lcd.print_message(event.body)
|
54
|
-
end
|
171
|
+
set_idle_text(event.body)
|
172
|
+
print_idle
|
55
173
|
end
|
56
174
|
end
|
57
175
|
|
58
176
|
def clear_screen
|
59
|
-
|
60
|
-
@lcd.print_message("")
|
61
|
-
end
|
177
|
+
print_message("")
|
62
178
|
end
|
63
179
|
|
64
180
|
def clean_up
|
@@ -69,6 +185,3 @@ module Tamashii
|
|
69
185
|
end
|
70
186
|
end
|
71
187
|
|
72
|
-
|
73
|
-
|
74
|
-
|
data/tamashii-agent.gemspec
CHANGED
@@ -35,10 +35,11 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_development_dependency "simplecov"
|
36
36
|
spec.add_development_dependency "guard"
|
37
37
|
spec.add_development_dependency "guard-rspec"
|
38
|
+
spec.add_development_dependency "timecop"
|
38
39
|
spec.add_development_dependency "pry"
|
39
40
|
|
40
41
|
|
41
|
-
spec.add_runtime_dependency "tamashii-common", ">=0.1.
|
42
|
+
spec.add_runtime_dependency "tamashii-common", ">=0.1.6"
|
42
43
|
spec.add_runtime_dependency "websocket-driver"
|
43
44
|
spec.add_runtime_dependency "nio4r"
|
44
45
|
spec.add_runtime_dependency "pi_piper"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tamashii-agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 蒼時弦也
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-08-
|
13
|
+
date: 2017-08-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -96,6 +96,20 @@ dependencies:
|
|
96
96
|
- - ">="
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: timecop
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
99
113
|
- !ruby/object:Gem::Dependency
|
100
114
|
name: pry
|
101
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,14 +130,14 @@ dependencies:
|
|
116
130
|
requirements:
|
117
131
|
- - ">="
|
118
132
|
- !ruby/object:Gem::Version
|
119
|
-
version: 0.1.
|
133
|
+
version: 0.1.6
|
120
134
|
type: :runtime
|
121
135
|
prerelease: false
|
122
136
|
version_requirements: !ruby/object:Gem::Requirement
|
123
137
|
requirements:
|
124
138
|
- - ">="
|
125
139
|
- !ruby/object:Gem::Version
|
126
|
-
version: 0.1.
|
140
|
+
version: 0.1.6
|
127
141
|
- !ruby/object:Gem::Dependency
|
128
142
|
name: websocket-driver
|
129
143
|
requirement: !ruby/object:Gem::Requirement
|