tamashii-agent 0.2.1 → 0.2.3

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: 2c9539d12e037a7109e01d2f764d549edc309f0e
4
- data.tar.gz: 7223ba91ffcbf0ec1e8f65850107d9d47aefe5c6
3
+ metadata.gz: '08de7a4e07004aa1fc2e0c3296d87c702fcb2e94'
4
+ data.tar.gz: bb089239efddb15e7f105042dbe972baa83b213e
5
5
  SHA512:
6
- metadata.gz: '0059b4a439dedff1ad3ba7b16a98f854c8ce26827ed0750a9a080518587a461824a21f0611dea28e9ee3c38cec2ead99a6c32a06168a8c56b6098cf0c18ab566'
7
- data.tar.gz: 007bd445e6a400c9b5c56ff8dbd73c78778963a2d74c56cc6218bb81297ea8052ffcbcf30039bcfa6bf84ff75e0a66eeae2bdb05728a63b0013aeabbd7f50772
6
+ metadata.gz: 44930b14acf4795f00ed470ebd5053b6a037b376645918dfc6343a1d7160dbbf12482672c4e750c5ce5ef2b3ca45a7ed987ccf792fb18a6d6e8eca2d3191947e
7
+ data.tar.gz: 4abad42266ef5bf48f4f8a578af8e927c5492b36b03acef06e535411c3602cdee44842228fcadfbe94bca7c368784fc11e3d87cdc890c515716c590d5e52682a
@@ -5,7 +5,7 @@ require 'tamashii/agent/adapter/buzzer'
5
5
  module Tamashii
6
6
  module Agent
7
7
  class Buzzer < Component
8
- def initialize
8
+ def initialize(master)
9
9
  super
10
10
  @buzzer = Adapter::Buzzer.object
11
11
  logger.debug "Using buzzer instance: #{@buzzer.class}"
@@ -1,4 +1,5 @@
1
1
  require 'mfrc522'
2
+ require 'concurrent'
2
3
 
3
4
  require 'tamashii/agent/component'
4
5
  require 'tamashii/agent/event'
@@ -8,13 +9,28 @@ require 'tamashii/agent/adapter/card_reader'
8
9
  module Tamashii
9
10
  module Agent
10
11
  class CardReader < Component
12
+
13
+ ERROR_RESET_TIMER = 5
14
+
11
15
  def initialize(master)
12
- super()
13
- @master = master
16
+ super
14
17
  @reader = Adapter::CardReader.object
15
18
  logger.debug "Using card_reader instance: #{@reader.class}"
16
19
  end
17
20
 
21
+ def reset_error_timer
22
+ return unless @error_timer_task
23
+ @error_timer_task.cancel
24
+ @error_timer_task = nil
25
+ logger.info "Error timer is reset"
26
+ end
27
+
28
+ def set_error_timer
29
+ return if @error_timer_task && !@error_timer_task.unscheduled?
30
+ logger.info "Error timer is set"
31
+ @error_timer_task = Concurrent::ScheduledTask.execute(ERROR_RESET_TIMER) { restart_current_component_async }
32
+ end
33
+
18
34
  # override
19
35
  def worker_loop
20
36
  loop do
@@ -39,10 +55,13 @@ module Tamashii
39
55
  begin
40
56
  uid, sak = @reader.picc_select
41
57
  process_uid(uid.join("-"))
58
+ reset_error_timer
42
59
  rescue CommunicationError, UnexpectedDataError => e
43
60
  logger.error "Error when selecting card: #{e.message}"
61
+ set_error_timer
44
62
  rescue => e
45
63
  logger.error "GemError when selecting card: #{e.message}"
64
+ set_error_timer
46
65
  end
47
66
  @reader.picc_halt
48
67
  true
@@ -57,6 +76,11 @@ module Tamashii
57
76
  def process_event(event)
58
77
  # silent is gold
59
78
  end
79
+
80
+ def clean_up
81
+ super
82
+ @reader.shutdown
83
+ end
60
84
  end
61
85
  end
62
86
  end
@@ -7,7 +7,8 @@ module Tamashii
7
7
  class Component
8
8
  include Common::Loggable
9
9
 
10
- def initialize
10
+ def initialize(master)
11
+ @master = master
11
12
  @event_queue = Queue.new
12
13
  end
13
14
 
@@ -28,6 +29,10 @@ module Tamashii
28
29
  ev
29
30
  end
30
31
 
32
+ def restart_current_component_async
33
+ @master.send_event(Event.new(Event::RESTART_COMPONENT, self.class))
34
+ end
35
+
31
36
  def process_event(event)
32
37
  logger.debug "Got event: #{event.type}, #{event.body}"
33
38
  end
@@ -76,19 +76,19 @@ module Tamashii
76
76
  attr_reader :url
77
77
  attr_reader :master
78
78
 
79
- def initialize(master, host, port)
80
- super()
81
- @master = master
82
- @url = "#{Config.use_ssl ? "wss" : "ws"}://#{host}:#{port}/#{Config.entry_point}"
79
+ def initialize(master)
80
+ super
81
+ @host = @master.host
82
+ @port = @master.port
83
+ @url = "#{Config.use_ssl ? "wss" : "ws"}://#{@host}:#{@port}/#{Config.entry_point}"
83
84
  self.reset
84
85
 
85
- @host = host
86
- @port = port
87
86
  @tag = 0
88
87
 
89
88
  @future_ivar_pool = Concurrent::Map.new
90
89
  @driver_lock = Mutex.new
91
90
 
91
+ @last_error_report_time = Time.now
92
92
  setup_resolver
93
93
  end
94
94
 
@@ -218,6 +218,10 @@ module Tamashii
218
218
 
219
219
  def try_create_socket
220
220
  logger.info "try to open socket..."
221
+ if Time.now - @last_error_report_time > 5.0
222
+ @master.send_event(Event.new(Event::LCD_MESSAGE, "Initializing\nConnection..."))
223
+ @last_error_report_time = Time.now
224
+ end
221
225
  if Config.use_ssl
222
226
  OpenSSL::SSL::SSLSocket.new(TCPSocket.new(@host, @port)).connect
223
227
  else
@@ -250,6 +254,7 @@ module Tamashii
250
254
  self.auth_success
251
255
  else
252
256
  logger.error "Authentication failed. Delay for 3 seconds"
257
+ @master.send_event(Event.new(Event::LCD_MESSAGE, "Fatal Error\nAuth Failed"))
253
258
  sleep 3
254
259
  end
255
260
  else
@@ -268,12 +273,16 @@ module Tamashii
268
273
  def process_event(event)
269
274
  case event.type
270
275
  when Event::CARD_DATA
271
- id = event.body
272
- wrapped_body = {
273
- id: id,
274
- ev_body: event.body
275
- }.to_json
276
- new_remote_request(id, Type::RFID_NUMBER, wrapped_body)
276
+ if self.ready?
277
+ id = event.body
278
+ wrapped_body = {
279
+ id: id,
280
+ ev_body: event.body
281
+ }.to_json
282
+ new_remote_request(id, Type::RFID_NUMBER, wrapped_body)
283
+ else
284
+ @master.send_event(Event.new(Event::CONNECTION_NOT_READY, "Connection not ready for #{event.type}:#{event.body}"))
285
+ end
277
286
  end
278
287
  end
279
288
 
@@ -30,6 +30,9 @@ module Tamashii
30
30
 
31
31
  def picc_halt(*args)
32
32
  end
33
+
34
+ def shutdown(*args)
35
+ end
33
36
  end
34
37
  end
35
38
  end
@@ -9,7 +9,10 @@ module Tamashii
9
9
  LCD_MESSAGE = 5
10
10
  LCD_SET_IDLE_TEXT = 6
11
11
 
12
+ RESTART_COMPONENT = 254
12
13
  CONNECTION_NOT_READY = 255
14
+
15
+
13
16
 
14
17
  attr_reader :type, :body
15
18
 
@@ -9,7 +9,7 @@ require 'tamashii/agent/adapter/lcd'
9
9
  module Tamashii
10
10
  module Agent
11
11
  class LCD < Component
12
- def initialize
12
+ def initialize(master)
13
13
  super
14
14
  load_lcd_device
15
15
  @device_lock = Mutex.new
@@ -12,9 +12,10 @@ module Tamashii
12
12
  class Master < Component
13
13
 
14
14
  attr_reader :serial_number
15
+ attr_reader :host, :port
15
16
 
16
17
  def initialize(host, port)
17
- super()
18
+ super(self)
18
19
  logger.info "Starting Tamashii::Agent #{Tamashii::Agent::VERSION} in #{Config.env} mode"
19
20
  @host = host
20
21
  @port = port
@@ -42,10 +43,10 @@ module Tamashii
42
43
 
43
44
  def create_components
44
45
  @components = {}
45
- @components[:connection] = create_component(Connection, self, @host, @port)
46
- @components[:buzzer] = create_component(Buzzer)
47
- @components[:lcd] = create_component(LCD)
48
- @components[:card_reader] = create_component(CardReader, self)
46
+ create_component(Connection, self)
47
+ create_component(Buzzer, self)
48
+ create_component(LCD, self)
49
+ create_component(CardReader, self)
49
50
  end
50
51
 
51
52
  def create_component(class_name, *args)
@@ -53,9 +54,22 @@ module Tamashii
53
54
  logger.info "Starting component: #{class_name}"
54
55
  yield c if block_given?
55
56
  c.run
57
+ @components[class_name] = c
58
+
56
59
  c
57
60
  end
58
61
 
62
+ def restart_component(class_name)
63
+ if old_component = @components[class_name]
64
+ logger.info "Stopping component: #{class_name}"
65
+ old_component.stop # TODO: set timeout for stopping?
66
+ logger.info "Restarting component: #{class_name}"
67
+ create_component(class_name, self)
68
+ else
69
+ logger.error "Rstart component failed: unknown component #{name}"
70
+ end
71
+ end
72
+
59
73
  # override
60
74
  def process_event(event)
61
75
  super
@@ -74,6 +88,9 @@ module Tamashii
74
88
  end
75
89
  when Event::CONNECTION_NOT_READY
76
90
  broadcast_event(Event.new(Event::BEEP, "error"))
91
+ broadcast_event(Event.new(Event::LCD_MESSAGE, "Fatal Error\nConnection Error"))
92
+ when Event::RESTART_COMPONENT
93
+ restart_component(event.body)
77
94
  else
78
95
  broadcast_event(event)
79
96
  end
@@ -1,5 +1,5 @@
1
1
  module Tamashii
2
2
  module Agent
3
- VERSION = "0.2.1"
3
+ VERSION = "0.2.3"
4
4
  end
5
5
  end
@@ -42,7 +42,7 @@ Gem::Specification.new do |spec|
42
42
  spec.add_runtime_dependency "websocket-driver"
43
43
  spec.add_runtime_dependency "nio4r"
44
44
  spec.add_runtime_dependency "pi_piper"
45
- spec.add_runtime_dependency "mfrc522"
45
+ spec.add_runtime_dependency "tamashii-mfrc522"
46
46
  spec.add_runtime_dependency "i2c"
47
47
  spec.add_runtime_dependency "aasm"
48
48
  spec.add_runtime_dependency "concurrent-ruby"
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.1
4
+ version: 0.2.3
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-07-27 00:00:00.000000000 Z
13
+ date: 2017-08-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -167,7 +167,7 @@ dependencies:
167
167
  - !ruby/object:Gem::Version
168
168
  version: '0'
169
169
  - !ruby/object:Gem::Dependency
170
- name: mfrc522
170
+ name: tamashii-mfrc522
171
171
  requirement: !ruby/object:Gem::Requirement
172
172
  requirements:
173
173
  - - ">="