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.
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
@@ -0,0 +1,37 @@
1
+ require 'tamashii/agent/device/card_reader/base'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ module Device
6
+ module CardReader
7
+ class Dummy < Base
8
+ def initialize(*args)
9
+ super
10
+ logger.debug "Initialized"
11
+ @last_time = Time.now
12
+ end
13
+
14
+ def poll_uid
15
+ if Time.now - @last_time > 2
16
+ @last_time = Time.now
17
+ if rand > 0.5
18
+ uid = Array.new(4){ rand(256)}
19
+ logger.debug "Fake Card Generated: #{uid}"
20
+ return uid
21
+ else
22
+ return nil
23
+ end
24
+ else
25
+ return nil
26
+ end
27
+ end
28
+
29
+ def shutdown
30
+ logger.debug "Stopped"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,43 @@
1
+ require 'mfrc522'
2
+ require 'tamashii/agent/device/card_reader/base'
3
+
4
+ module Tamashii
5
+ module Agent
6
+ module Device
7
+ module CardReader
8
+ class Mfrc522Spi < Base
9
+
10
+ def initialize(*args)
11
+ super
12
+ @reader = MFRC522.new
13
+ end
14
+
15
+ def poll_uid
16
+ # check antenna
17
+ return nil unless @reader.picc_request(MFRC522::PICC_REQA)
18
+
19
+ # read uid
20
+ uid = nil
21
+ begin
22
+ uid, sak = @reader.picc_select
23
+ rescue CommunicationError, UnexpectedDataError => e
24
+ logger.error "Error when selecting card: #{e.message}"
25
+ uid = :error
26
+ rescue => e
27
+ uid = :error
28
+ logger.error "GemError when selecting card: #{e.message}"
29
+ ensure
30
+ @reader.picc_halt
31
+ end
32
+ uid
33
+ end
34
+
35
+ def shutdown
36
+ @reader.shutdown
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,52 @@
1
+ require 'nfc'
2
+ require 'tamashii/agent/device/card_reader/base'
3
+
4
+ module Tamashii
5
+ module Agent
6
+ module Device
7
+ module CardReader
8
+ class Pn532Uart < Base
9
+ def initialize(*args)
10
+ super
11
+ @ctx = NFC::Context.new
12
+ @dev = @ctx.open "pn532_uart:#{fetch_path}"
13
+ @card_type = @options[:card_type] || :felica
14
+ logger.info "Card type enabled: #{@card_type}"
15
+ end
16
+
17
+ def default_path
18
+ "/dev/ttyAMA0"
19
+ end
20
+
21
+ def fetch_path
22
+ if @options.has_key?(:path)
23
+ path = @options[:path]
24
+ else
25
+ path = default_path
26
+ logger.warn "No path specified. Use default path: #{path}"
27
+ end
28
+ path
29
+ end
30
+
31
+ def poll_uid
32
+ tag = @dev.poll(@card_type)
33
+ if tag && !tag.is_a?(Integer)
34
+ return tag.uid
35
+ else
36
+ return nil
37
+ end
38
+ rescue => e
39
+ logger.error "Error when reading card: #{e.message}"
40
+ return :error
41
+ end
42
+
43
+ def shutdown
44
+ @dev.close
45
+ @dev = nil
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+
@@ -0,0 +1,20 @@
1
+ require 'tamashii/agent/common'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ module Device
6
+ class DeviceBase
7
+ include Common::Loggable
8
+
9
+ def initialize(component, options = {})
10
+ @component = component
11
+ @options = options
12
+ end
13
+
14
+ def shutdown
15
+ logger.warn "Device '#{self.class}' does not implement a shutdown method"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ require 'tamashii/agent/device/device_base'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ module Device
6
+ module Lcd
7
+ class Base < DeviceBase
8
+ # default implementation
9
+ def print_message(message)
10
+ lines = message.lines.map{|l| l.delete("\n")}
11
+ line_count.times.each { |line| print_line(lines[line], line) }
12
+ end
13
+
14
+ def line_count
15
+ raise NotImplementedError, "line_count"
16
+ end
17
+
18
+ def width
19
+ raise NotImplementedError, "width"
20
+ end
21
+
22
+ def print_line(message, line)
23
+ raise NotImplementedError, "print_line"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ require 'tamashii/agent/device/lcd/base'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ module Device
6
+ module Lcd
7
+ class Dummy < Base
8
+ def line_count
9
+ 2
10
+ end
11
+
12
+ def width
13
+ 16
14
+ end
15
+
16
+ def print_line(message, line)
17
+ message = '' unless message
18
+ message = message.ljust(width, ' ')
19
+ message.split('').take(width).join('')
20
+ logger.debug "Line #{line}: #{message}"
21
+ end
22
+
23
+ def shutdown
24
+ logger.debug "Stopped"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,133 @@
1
+ require 'i2c'
2
+ require 'tamashii/agent/device/lcd/base'
3
+
4
+ module Tamashii
5
+ module Agent
6
+ module Device
7
+ module Lcd
8
+ class Lcm1602I2c < Base
9
+ WIDTH = 16
10
+ LINE_COUNT = 2
11
+
12
+ OP_CHR = 1
13
+ OP_CMD = 0
14
+
15
+ LINES = [
16
+ 0x80,
17
+ 0xC0
18
+ ].freeze
19
+
20
+ BACKLIGHT_ON = 0x08
21
+ BACKLIGHT_OFF = 0x00
22
+
23
+ ENABLE = 0b00000100
24
+
25
+ PULSE = 0.0005
26
+ DELAY = 0.0005
27
+
28
+ attr_accessor :backlight
29
+
30
+ def width
31
+ 16
32
+ end
33
+
34
+ def line_count
35
+ 2
36
+ end
37
+
38
+ def initialize(*args)
39
+ super
40
+ initialize_lcd
41
+ end
42
+
43
+ def default_path
44
+ '/dev/i2c-1'
45
+ end
46
+
47
+ def default_address
48
+ 0x27
49
+ end
50
+
51
+ def print_line(message, line)
52
+ write_line(message, LINES[line])
53
+ end
54
+
55
+ def shutdown
56
+ print_message("")
57
+ end
58
+
59
+ private
60
+
61
+ def fetch_address
62
+ if @options.has_key?(:address)
63
+ address = @options[:address]
64
+ else
65
+ address = default_address
66
+ logger.warn "No address specified. Use default address: #{address.to_s(16)}"
67
+ end
68
+ address
69
+ end
70
+
71
+ def fetch_path
72
+ if @options.has_key?(:path)
73
+ path = @options[:path]
74
+ else
75
+ path = default_path
76
+ logger.warn "No path specified. Use default path: #{path}"
77
+ end
78
+ path
79
+ end
80
+
81
+ def initialize_lcd
82
+ @lcd = I2C.create(fetch_path)
83
+ @address = fetch_address
84
+ @backlight = @options.fetch(:backlight, true)
85
+
86
+ byte(0x33, OP_CMD)
87
+ byte(0x32, OP_CMD)
88
+ byte(0x06, OP_CMD)
89
+ byte(0x0C, OP_CMD)
90
+ byte(0x28, OP_CMD)
91
+ byte(0x01, OP_CMD)
92
+ sleep(DELAY)
93
+ end
94
+
95
+ def backlight_mode
96
+ return BACKLIGHT_ON if @backlight
97
+ BACKLIGHT_OFF
98
+ end
99
+
100
+ def write_line(message, line)
101
+ message = '' unless message
102
+ message = message.ljust(WIDTH, ' ')
103
+ byte(line, OP_CMD)
104
+ WIDTH.times.each { |pos| byte(message[pos].ord, OP_CHR) }
105
+ end
106
+
107
+ def write(bits)
108
+ @lcd.write(@address, bits)
109
+ end
110
+
111
+ def byte(bits, mode)
112
+ high = mode | (bits & 0xF0) | backlight_mode
113
+ low = mode | (bits << 4) & 0xF0 | backlight_mode
114
+
115
+ write(high)
116
+ toggle(high)
117
+
118
+ write(low)
119
+ toggle(low)
120
+ end
121
+
122
+ def toggle(bits)
123
+ sleep(DELAY)
124
+ write(bits | ENABLE)
125
+ sleep(PULSE)
126
+ write(bits & ~ENABLE)
127
+ sleep(DELAY)
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -6,8 +6,8 @@ module Tamashii
6
6
  class Base < Tamashii::Handler
7
7
  def initialize(*args, &block)
8
8
  super(*args, &block)
9
- @connection = self.env[:connection]
10
- @master = @connection.master
9
+ @networking = self.env[:networking]
10
+ @master = self.env[:master]
11
11
  end
12
12
  end
13
13
  end
@@ -4,7 +4,7 @@ require 'tamashii/agent/handler/base'
4
4
  module Tamashii
5
5
  module Agent
6
6
  module Handler
7
- class LCD < Base
7
+ class Lcd < Base
8
8
  def resolve(data)
9
9
  case type
10
10
  when Type::LCD_MESSAGE
@@ -5,7 +5,7 @@ module Tamashii
5
5
  module Handler
6
6
  class RemoteResponse < Base
7
7
  def resolve(data)
8
- @connection.handle_remote_response(self.type, data)
8
+ @networking.handle_remote_response(self.type, data)
9
9
  end
10
10
  end
11
11
  end
@@ -2,12 +2,10 @@ require 'concurrent'
2
2
 
3
3
  require 'tamashii/agent/common'
4
4
  require 'tamashii/agent/event'
5
- require 'tamashii/agent/adapter/lcd'
6
-
7
5
 
8
6
  module Tamashii
9
7
  module Agent
10
- class LCD < Component
8
+ class Lcd < Component
11
9
 
12
10
  class LineAnimator
13
11
  include Common::Loggable
@@ -77,10 +75,10 @@ module Tamashii
77
75
  end
78
76
  end
79
77
 
80
- def initialize(master)
78
+ def initialize(name, master, options = {})
81
79
  super
82
- load_lcd_device
83
- @device_line_count = @lcd.class::LINE_COUNT
80
+ @lcd = initialize_device
81
+ @device_line_count = @lcd.line_count
84
82
  @device_lock = Mutex.new
85
83
  create_line_animators
86
84
  set_idle_text("[Tamashii]\nIdle...")
@@ -89,21 +87,21 @@ module Tamashii
89
87
  schedule_to_print_idle
90
88
  end
91
89
 
90
+ def default_device_name
91
+ 'Dummy'
92
+ end
93
+
94
+ def get_device_class_name(device_name)
95
+ "Lcd::#{device_name}"
96
+ end
97
+
92
98
  def create_line_animators
93
- LineAnimator.line_width = @lcd.class::WIDTH
99
+ LineAnimator.line_width = @lcd.width
94
100
  LineAnimator.handler_print_line = method(:print_line)
95
101
  @line_animators = []
96
102
  @device_line_count.times {|i| @line_animators << LineAnimator.new(i)}
97
103
  end
98
104
 
99
- def load_lcd_device
100
- @lcd = Adapter::LCD.object
101
- rescue => e
102
- logger.error "Unable to load LCD instance: #{Adapter::LCD.current_class}"
103
- logger.error "Use #{Adapter::LCD.fake_class} instead"
104
- @lcd = Adapter::LCD.fake_class.new
105
- end
106
-
107
105
  def print_message(message)
108
106
  lines = message.lines.map{|l| l.delete("\n")}
109
107
  @device_line_count.times do |line_count|
@@ -185,8 +183,8 @@ module Tamashii
185
183
  end
186
184
 
187
185
  def clean_up
188
- clear_screen
189
186
  super
187
+ @lcd.shutdown
190
188
  end
191
189
  end
192
190
  end