tamashii-agent 0.3.0 → 0.3.1

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/exe/tamashii-agent +7 -5
  3. data/lib/tamashii/agent/buzzer.rb +11 -5
  4. data/lib/tamashii/agent/card_reader.rb +21 -21
  5. data/lib/tamashii/agent/common.rb +25 -0
  6. data/lib/tamashii/agent/component.rb +38 -3
  7. data/lib/tamashii/agent/config.rb +13 -2
  8. data/lib/tamashii/agent/device/buzzer/base.rb +26 -0
  9. data/lib/tamashii/agent/device/buzzer/dummy.rb +32 -0
  10. data/lib/tamashii/agent/device/buzzer/gpio_buzzer.rb +89 -0
  11. data/lib/tamashii/agent/device/card_reader/base.rb +16 -0
  12. data/lib/tamashii/agent/device/card_reader/dummy.rb +37 -0
  13. data/lib/tamashii/agent/device/card_reader/mfrc522_spi.rb +43 -0
  14. data/lib/tamashii/agent/device/card_reader/pn532_uart.rb +52 -0
  15. data/lib/tamashii/agent/device/device_base.rb +20 -0
  16. data/lib/tamashii/agent/device/lcd/base.rb +29 -0
  17. data/lib/tamashii/agent/device/lcd/dummy.rb +30 -0
  18. data/lib/tamashii/agent/device/lcd/lcm1602_i2c.rb +133 -0
  19. data/lib/tamashii/agent/handler/base.rb +2 -2
  20. data/lib/tamashii/agent/handler/lcd.rb +1 -1
  21. data/lib/tamashii/agent/handler/remote_response.rb +1 -1
  22. data/lib/tamashii/agent/lcd.rb +14 -16
  23. data/lib/tamashii/agent/master.rb +20 -22
  24. data/lib/tamashii/agent/{connection.rb → networking.rb} +5 -6
  25. data/lib/tamashii/agent/{connection → networking}/request_observer.rb +5 -5
  26. data/lib/tamashii/agent/version.rb +1 -1
  27. data/tamashii-agent.gemspec +4 -3
  28. metadata +32 -16
  29. data/lib/tamashii/agent/adapter/base.rb +0 -28
  30. data/lib/tamashii/agent/adapter/buzzer.rb +0 -21
  31. data/lib/tamashii/agent/adapter/card_reader.rb +0 -20
  32. data/lib/tamashii/agent/adapter/lcd.rb +0 -22
  33. data/lib/tamashii/agent/device/fake_buzzer.rb +0 -30
  34. data/lib/tamashii/agent/device/fake_card_reader.rb +0 -40
  35. data/lib/tamashii/agent/device/fake_lcd.rb +0 -31
  36. data/lib/tamashii/agent/device/lcd.rb +0 -91
  37. data/lib/tamashii/agent/device/pi_buzzer.rb +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5de4cba829b0eab020881898175c0dabd45f9a94
4
- data.tar.gz: 1700db0dc1f111c39871a195a1fc82919ceef6a7
3
+ metadata.gz: 5e9ec90a332693cf4e81bc2c7425eca46d8dc7d2
4
+ data.tar.gz: 970f014149a4cf6f427e8217323414be5f80a744
5
5
  SHA512:
6
- metadata.gz: d5eb697ea55e98cb2fc0dac672e2e4946bb7ba7388255120cc09e9c6cf116f64877df28fabbb7d1a01310494410d88142395e5b55813eefa6f81f54c6ca7f20b
7
- data.tar.gz: 9d8d9ddd661cb0989a082b9dbba74cf5e645102eab9a8b7289ec8296330bcd937508bc8631ad233753f17cfcbc0d33da0bdd41dc67f1dda044362bcb1b9efa54
6
+ metadata.gz: 4b7035125ae4da75c9bae4cb2cca8b601a1215a57d0da0654195b7611607e11a2577b1e54fcdbe607b914edf29173aa360bb52e5a4e29f140e8cb650de7114a1
7
+ data.tar.gz: 99a438cc526180f5cf261f2a7f9582733251f9285cd6ed489e94bf388907efa1e409cbba77c1460ee513b1fed008ddf604c8ace5585e9692f8238af95b15c7c4
data/exe/tamashii-agent CHANGED
@@ -22,12 +22,14 @@ OptionParser.new do |opts|
22
22
  File.open(SYSTEM_CONFIG_FILENAME, "w") do |f|
23
23
  f.write <<-EOS
24
24
  Tamashii::Agent::config do
25
- manager_host "localhost"
26
- manager_port 3000
25
+ use_ssl false
26
+ host "localhost"
27
+ port 3000
28
+ entry_point "/tamashii"
27
29
  log_file "/var/log/tamashii-agent.log"
28
- log_level "info"
30
+ log_level :INFO
29
31
  auth_type :token
30
- token "abc123"
32
+ token "SECRET_TOKEN"
31
33
  end
32
34
  EOS
33
35
  end
@@ -75,7 +77,7 @@ begin
75
77
  when :token
76
78
  raise LoadError.new("Token authorization require to set token") if config.token.nil?
77
79
  end
78
- agent = Tamashii::Agent::Master.new(config.manager_host, config.manager_port)
80
+ agent = Tamashii::Agent::Master.new
79
81
 
80
82
 
81
83
  Signal.trap("TERM") do
@@ -1,14 +1,20 @@
1
1
  require 'tamashii/agent/component'
2
2
  require 'tamashii/agent/event'
3
- require 'tamashii/agent/adapter/buzzer'
4
3
 
5
4
  module Tamashii
6
5
  module Agent
7
6
  class Buzzer < Component
8
- def initialize(master)
7
+ def initialize(name, master, options = {})
9
8
  super
10
- @buzzer = Adapter::Buzzer.object
11
- logger.debug "Using buzzer instance: #{@buzzer.class}"
9
+ @buzzer = initialize_device
10
+ end
11
+
12
+ def default_device_name
13
+ 'Dummy'
14
+ end
15
+
16
+ def get_device_class_name(device_name)
17
+ "Buzzer::#{device_name}"
12
18
  end
13
19
 
14
20
  def process_event(event)
@@ -28,7 +34,7 @@ module Tamashii
28
34
 
29
35
  def clean_up
30
36
  super
31
- @buzzer.stop
37
+ @buzzer.shutdown
32
38
  end
33
39
  end
34
40
  end
@@ -1,10 +1,7 @@
1
- require 'mfrc522'
2
1
  require 'concurrent'
3
2
 
4
3
  require 'tamashii/agent/component'
5
4
  require 'tamashii/agent/event'
6
- require 'tamashii/agent/adapter/card_reader'
7
-
8
5
 
9
6
  module Tamashii
10
7
  module Agent
@@ -12,10 +9,17 @@ module Tamashii
12
9
 
13
10
  ERROR_RESET_TIMER = 5
14
11
 
15
- def initialize(master)
12
+ def initialize(name, master, options = {})
16
13
  super
17
- @reader = Adapter::CardReader.object
18
- logger.debug "Using card_reader instance: #{@reader.class}"
14
+ @reader = initialize_device
15
+ end
16
+
17
+ def default_device_name
18
+ 'Dummy'
19
+ end
20
+
21
+ def get_device_class_name(device_name)
22
+ "CardReader::#{device_name}"
19
23
  end
20
24
 
21
25
  def reset_error_timer
@@ -49,27 +53,23 @@ module Tamashii
49
53
  end
50
54
 
51
55
  def handle_card
52
- # read card
53
- return false unless @reader.picc_request(MFRC522::PICC_REQA)
54
-
55
- begin
56
- uid, sak = @reader.picc_select
57
- process_uid(uid.join("-"))
58
- reset_error_timer
59
- rescue CommunicationError, UnexpectedDataError => e
60
- logger.error "Error when selecting card: #{e.message}"
61
- set_error_timer
62
- rescue => e
63
- logger.error "GemError when selecting card: #{e.message}"
56
+ uid = @reader.poll_uid
57
+ case uid
58
+ when nil
59
+ return false
60
+ when :error
64
61
  set_error_timer
62
+ return false
63
+ else
64
+ process_uid(uid)
65
+ reset_error_timer
66
+ return true
65
67
  end
66
- @reader.picc_halt
67
- true
68
68
  end
69
69
 
70
70
  def process_uid(uid)
71
71
  logger.info "New card detected, UID: #{uid}"
72
- @master.send_event(Event.new(Event::CARD_DATA, uid))
72
+ @master.send_event(Event.new(Event::CARD_DATA, uid.join('-')))
73
73
  end
74
74
 
75
75
  # override
@@ -3,6 +3,31 @@ require 'tamashii/agent/common/loggable'
3
3
  module Tamashii
4
4
  module Agent
5
5
  module Common
6
+
7
+ def self.load_device_class(device_class_name)
8
+ full_class_name = 'Tamashii::Agent::Device::' + device_class_name
9
+ load_class(full_class_name)
10
+ end
11
+
12
+ def self.load_class(class_name)
13
+ path = get_class_path(class_name)
14
+ require path
15
+ Module.const_get(class_name)
16
+ end
17
+
18
+ def self.get_class_path(class_name)
19
+ string_underscore(class_name)
20
+ end
21
+
22
+ def self.string_underscore(original)
23
+ word = original.dup
24
+ word.gsub!(/::/, '/')
25
+ word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
26
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
27
+ word.tr!("-", "_")
28
+ word.downcase!
29
+ word
30
+ end
6
31
  end
7
32
  end
8
33
  end
@@ -7,8 +7,12 @@ module Tamashii
7
7
  class Component
8
8
  include Common::Loggable
9
9
 
10
- def initialize(master)
10
+ class LoadDeviceError < RuntimeError; end
11
+
12
+ def initialize(name, master, options = {})
13
+ @name = name
11
14
  @master = master
15
+ @options = options
12
16
  @event_queue = Queue.new
13
17
  end
14
18
 
@@ -30,7 +34,7 @@ module Tamashii
30
34
  end
31
35
 
32
36
  def restart_current_component_async
33
- @master.send_event(Event.new(Event::RESTART_COMPONENT, self.class))
37
+ @master.send_event(Event.new(Event::RESTART_COMPONENT, @name))
34
38
  end
35
39
 
36
40
  def process_event(event)
@@ -47,7 +51,7 @@ module Tamashii
47
51
  end
48
52
 
49
53
  def stop
50
- logger.info "Stopping component"
54
+ logger.info "Stopping component #{@name}"
51
55
  stop_threads
52
56
  clean_up
53
57
  end
@@ -73,6 +77,37 @@ module Tamashii
73
77
  end
74
78
  end
75
79
  end
80
+
81
+ def initialize_device
82
+ device_name = @options[:device] || default_device_name
83
+ logger.info "Using device: #{device_name}"
84
+ get_device_instance(device_name)
85
+ rescue => e
86
+ logger.error "Error when loading device: #{e.message}"
87
+ e.backtrace.each {|msg| logger.error msg}
88
+ logger.error "Fallback to default: #{default_device_name}"
89
+ load_default_device
90
+ end
91
+
92
+ def get_device_instance(device_name)
93
+ klass = Common.load_device_class(get_device_class_name(device_name))
94
+ klass.new(self, @options)
95
+ end
96
+
97
+ def load_default_device
98
+ logger.info "loading default device: #{default_device_name}"
99
+ get_device_instance(default_device_name)
100
+ rescue => e
101
+ raise LoadDeviceError, "Unable to load device: #{e.message}"
102
+ end
103
+
104
+ def default_device_name
105
+ raise NotImplementedError
106
+ end
107
+
108
+ def get_device_class_name(device_name)
109
+ raise NotImplementedError
110
+ end
76
111
  end
77
112
  end
78
113
  end
@@ -5,12 +5,11 @@ module Tamashii
5
5
  class Config < Tamashii::Config
6
6
  AUTH_TYPES = [:none, :token]
7
7
 
8
+ register :default_components, {networking: {class_name: :Networking, options: {}}}
8
9
  register :connection_timeout, 3
9
10
 
10
11
  register :localtime, "+08:00"
11
12
 
12
- register :lcd_path, '/dev/i2c-1'
13
- register :lcd_address, 0x27
14
13
  register :lcd_animation_delay, 1
15
14
 
16
15
 
@@ -37,6 +36,18 @@ module Tamashii
37
36
  Tamashii::Client.config.send(method_name, *args)
38
37
  end
39
38
  end
39
+
40
+ def add_component(name, class_name, options = {}, &block)
41
+ self.components[name] = {class_name: class_name, options: options, block: block}
42
+ end
43
+
44
+ def remove_component(name)
45
+ self.components.delete(name)
46
+ end
47
+
48
+ def components
49
+ @components ||= self.default_components.clone
50
+ end
40
51
  end
41
52
  end
42
53
  end
@@ -0,0 +1,26 @@
1
+ require 'tamashii/agent/common'
2
+ require 'tamashii/agent/device/device_base'
3
+
4
+ module Tamashii
5
+ module Agent
6
+ module Device
7
+ module Buzzer
8
+ class Base < DeviceBase
9
+ include Common::Loggable
10
+
11
+ def play_ok
12
+ raise NotImplementedError, "play_ok"
13
+ end
14
+
15
+ def play_no
16
+ raise NotImplementedError, "play_no"
17
+ end
18
+
19
+ def play_error
20
+ raise NotImplementedError, "play_error"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,32 @@
1
+ require 'tamashii/agent/device/buzzer/base'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ module Device
6
+ module Buzzer
7
+ class Dummy < Base
8
+ def initialize(*args)
9
+ super
10
+ logger.debug "Initialized"
11
+ end
12
+
13
+ def play_ok
14
+ logger.debug "Played: OK"
15
+ end
16
+
17
+ def play_no
18
+ logger.debug "Played: No"
19
+ end
20
+
21
+ def play_error
22
+ logger.debug "Played: Error"
23
+ end
24
+
25
+ def shutdown
26
+ logger.debug "Stopped"
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,89 @@
1
+ require 'pi_piper'
2
+ require 'tamashii/agent/device/buzzer/base'
3
+
4
+ module Tamashii
5
+ module Agent
6
+ module Device
7
+ module Buzzer
8
+ class GpioBuzzer < Base
9
+
10
+ DEFAULT_PIN = 18
11
+ SHORT_PLAY_TIME = 0.2
12
+ LONG_PLAY_TIME = 0.5
13
+ REPEAT_INTERVAL = 0.1
14
+ LOW_FREQ = 0.7
15
+
16
+ def initialize(*args)
17
+ super
18
+ setup_pwm
19
+ end
20
+
21
+ def shutdown
22
+ stop
23
+ end
24
+
25
+ def play_ok
26
+ play_repeat_short(1)
27
+ end
28
+
29
+ def play_no
30
+ play_repeat_short(3)
31
+ end
32
+
33
+ def play_error
34
+ play_repeat_long(3)
35
+ end
36
+
37
+ private
38
+
39
+ def stop
40
+ @pwm.off
41
+ end
42
+
43
+ def setup_pwm
44
+ unless pin = @options[:pin]
45
+ logger.warn "No GPIO pin given. Using default: #{DEFAULT_PIN}"
46
+ pin = DEFAULT_PIN
47
+ end
48
+ @pwm = PiPiper::Pwm.new pin: pin #, mode: :markspace
49
+ @pwm.off
50
+ @pwm.value = 1.0
51
+ end
52
+
53
+ def play(value = 1.0)
54
+ @pwm.value = value
55
+ @pwm.on
56
+ end
57
+
58
+ def play_short(value = 1.0)
59
+ play_time(SHORT_PLAY_TIME,value)
60
+ end
61
+
62
+ def play_long(value = 1.0)
63
+ play_time(LONG_PLAY_TIME,value)
64
+ end
65
+
66
+ def play_time(time, value = 1.0)
67
+ play(value)
68
+ sleep time
69
+ stop
70
+ end
71
+
72
+ def play_repeat_short(repeat, repeat_interval = REPEAT_INTERVAL)
73
+ repeat.times do
74
+ play_short
75
+ sleep repeat_interval
76
+ end
77
+ end
78
+
79
+ def play_repeat_long(repeat, repeat_interval = REPEAT_INTERVAL)
80
+ repeat.times do
81
+ play_long
82
+ sleep repeat_interval
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,16 @@
1
+ require 'tamashii/agent/device/device_base'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ module Device
6
+ module CardReader
7
+ class Base < DeviceBase
8
+ def poll_uid
9
+ raise NotImplementedError, "poll_uid"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+