tamashii-agent 0.2.5 → 0.2.6

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: 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