tamashii-agent 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|