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.
- checksums.yaml +4 -4
- data/exe/tamashii-agent +7 -5
- data/lib/tamashii/agent/buzzer.rb +11 -5
- data/lib/tamashii/agent/card_reader.rb +21 -21
- data/lib/tamashii/agent/common.rb +25 -0
- data/lib/tamashii/agent/component.rb +38 -3
- data/lib/tamashii/agent/config.rb +13 -2
- data/lib/tamashii/agent/device/buzzer/base.rb +26 -0
- data/lib/tamashii/agent/device/buzzer/dummy.rb +32 -0
- data/lib/tamashii/agent/device/buzzer/gpio_buzzer.rb +89 -0
- data/lib/tamashii/agent/device/card_reader/base.rb +16 -0
- data/lib/tamashii/agent/device/card_reader/dummy.rb +37 -0
- data/lib/tamashii/agent/device/card_reader/mfrc522_spi.rb +43 -0
- data/lib/tamashii/agent/device/card_reader/pn532_uart.rb +52 -0
- data/lib/tamashii/agent/device/device_base.rb +20 -0
- data/lib/tamashii/agent/device/lcd/base.rb +29 -0
- data/lib/tamashii/agent/device/lcd/dummy.rb +30 -0
- data/lib/tamashii/agent/device/lcd/lcm1602_i2c.rb +133 -0
- data/lib/tamashii/agent/handler/base.rb +2 -2
- data/lib/tamashii/agent/handler/lcd.rb +1 -1
- data/lib/tamashii/agent/handler/remote_response.rb +1 -1
- data/lib/tamashii/agent/lcd.rb +14 -16
- data/lib/tamashii/agent/master.rb +20 -22
- data/lib/tamashii/agent/{connection.rb → networking.rb} +5 -6
- data/lib/tamashii/agent/{connection → networking}/request_observer.rb +5 -5
- data/lib/tamashii/agent/version.rb +1 -1
- data/tamashii-agent.gemspec +4 -3
- metadata +32 -16
- data/lib/tamashii/agent/adapter/base.rb +0 -28
- data/lib/tamashii/agent/adapter/buzzer.rb +0 -21
- data/lib/tamashii/agent/adapter/card_reader.rb +0 -20
- data/lib/tamashii/agent/adapter/lcd.rb +0 -22
- data/lib/tamashii/agent/device/fake_buzzer.rb +0 -30
- data/lib/tamashii/agent/device/fake_card_reader.rb +0 -40
- data/lib/tamashii/agent/device/fake_lcd.rb +0 -31
- data/lib/tamashii/agent/device/lcd.rb +0 -91
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e9ec90a332693cf4e81bc2c7425eca46d8dc7d2
|
4
|
+
data.tar.gz: 970f014149a4cf6f427e8217323414be5f80a744
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
26
|
-
|
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
|
30
|
+
log_level :INFO
|
29
31
|
auth_type :token
|
30
|
-
token "
|
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
|
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 =
|
11
|
-
|
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.
|
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 =
|
18
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
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,
|
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
|