tamashii-agent 0.2.1 → 0.2.3

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