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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e19cd4d2b7129befe8660e8841e46281d7c3f2be
4
- data.tar.gz: 25cd75e5189d50ed84bf53bd24b5fa01c65682ea
3
+ metadata.gz: 8472e90c77ca68d4a0d15db970fb273fb389062d
4
+ data.tar.gz: db69d53412c00a2b54a31a3e6a6ea890c60e1492
5
5
  SHA512:
6
- metadata.gz: 83bdcd64c59293adbe9951aae411e5717162893981e51a0352fd01453354798732278c0db620cb4bc784d85889200480118c0ac8f7f9e9d706f2581ffb7a9c6c
7
- data.tar.gz: 334b41844278c811c406386315a297da6b83e102c073a6dd4bbf5a409c736b553a28396424e943d40b4a878d0ac1e4a3556ee4ec6c254f332520c7385a10bf59
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
- puts "LCD Display(BACKLIGHT: #{@backlight}):"
17
- puts lines.take(2).map { |line| print_line(line) }.join("\n")
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
- private
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
- 2.times.each { |line| print_line(lines[line], LINES[line]) }
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 print_line(message, line)
59
+ def write_line(message, line)
55
60
  message = '' unless message
56
61
  message = message.ljust(WIDTH, ' ')
57
62
  byte(line, OP_CMD)
@@ -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
- @idle_message = "[Tamashii]\nIdle..."
78
+ create_line_animators
79
+ set_idle_text("[Tamashii]\nIdle...")
17
80
  logger.debug "Using LCD instance: #{@lcd.class}"
18
- @lcd.print_message("Initializing\nPlease wait...")
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
- @device_lock.synchronize do
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
- @idle_message = event.body
52
- @device_lock.synchronize do
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
- @device_lock.synchronize do
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
-
@@ -1,5 +1,5 @@
1
1
  module Tamashii
2
2
  module Agent
3
- VERSION = "0.2.5"
3
+ VERSION = "0.2.6"
4
4
  end
5
5
  end
@@ -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.5"
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.5
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-01 00:00:00.000000000 Z
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.5
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.5
140
+ version: 0.1.6
127
141
  - !ruby/object:Gem::Dependency
128
142
  name: websocket-driver
129
143
  requirement: !ruby/object:Gem::Requirement