smartware 0.3.1 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'smartware'
6
+
7
+ EventMachine.run do
8
+ Smartware.subscribe do |key, *value|
9
+ puts "#{key}: #{value.map(&:inspect).join(", ")}"
10
+ end
11
+
12
+ puts "Receiving Smartware events."
13
+ end
data/lib/smartware.rb CHANGED
@@ -6,6 +6,7 @@ require 'redcarpet'
6
6
  require 'stringio'
7
7
  require 'eventmachine'
8
8
  require 'serialport'
9
+ require 'json'
9
10
 
10
11
  require 'smartkiosk/common'
11
12
 
@@ -25,6 +26,8 @@ require 'smartware/interfaces/printer'
25
26
  require 'smartware/interfaces/watchdog'
26
27
  require 'smartware/interfaces/card_reader'
27
28
  require 'smartware/connection_monitor'
29
+ require 'smartware/pub_sub_server'
30
+ require 'smartware/pub_sub_client'
28
31
 
29
32
  module Smartware
30
33
 
@@ -32,6 +35,10 @@ module Smartware
32
35
  yield self
33
36
  end
34
37
 
38
+ def self.card_reader
39
+ Smartware::Client::CardReader
40
+ end
41
+
35
42
  def self.cash_acceptor
36
43
  Smartware::Client::CashAcceptor
37
44
  end
@@ -48,4 +55,15 @@ module Smartware
48
55
  Smartware::Client::Watchdog
49
56
  end
50
57
 
58
+ def self.subscribe(&block)
59
+ Smartware::PubSubClient.destroy_static_client
60
+ client = Smartware::PubSubClient.create_static_client
61
+ client.receiver = block
62
+ client.start
63
+ client
64
+ end
65
+
66
+ def self.unsubscribe
67
+ Smartware::PubSubClient.destroy_static_client
68
+ end
51
69
  end
@@ -8,13 +8,6 @@ module Smartware
8
8
  DRb.start_service
9
9
  @device = DRbObject.new_with_uri('druby://localhost:6004')
10
10
 
11
- def self.open(limit_min = nil, limit_max = nil)
12
- @device.open_session(limit_min, limit_max)
13
- end
14
-
15
- def self.close
16
- @device.close_session
17
- end
18
11
 
19
12
  def self.status
20
13
  @device.status
@@ -32,28 +25,16 @@ module Smartware
32
25
  @device.version
33
26
  end
34
27
 
35
- def self.card_inserted?
36
- @device.card_inserted?
37
- end
38
-
39
- def self.start_accepting
40
- @device.start_accepting
28
+ def self.open
29
+ @device.open
41
30
  end
42
31
 
43
- def self.stop_accepting
44
- @device.stop_accepting
45
- end
46
-
47
- def self.eject
48
- @device.eject
49
- end
50
-
51
- def self.capture
52
- @device.capture
32
+ def self.close
33
+ @device.close
53
34
  end
54
35
 
55
- def self.read_magstrip
56
- @device.read_magstrip
36
+ def self.card_inserted
37
+ @device.card_inserted
57
38
  end
58
39
  end
59
40
  end
@@ -40,6 +40,13 @@ module Smartware
40
40
  @device.cashsum
41
41
  end
42
42
 
43
+ def self.insert_casette
44
+ @device.insert_casette
45
+ end
46
+
47
+ def self.eject_casette
48
+ @device.eject_casette
49
+ end
43
50
  end
44
51
  end
45
52
  end
@@ -66,7 +66,7 @@ module Smartware
66
66
 
67
67
  attr_reader :bill_types
68
68
 
69
- attr_accessor :escrow, :stacked, :returned, :status
69
+ attr_accessor :open, :closed, :escrow, :stacked, :returned, :status
70
70
  attr_accessor :enabled_types
71
71
 
72
72
  def initialize(config)
@@ -76,6 +76,8 @@ module Smartware
76
76
  @connection = EventMachine.attach @io, CCNETConnection
77
77
  @connection.address = 3
78
78
 
79
+ @open = nil
80
+ @closed = nil
79
81
  @escrow = nil
80
82
  @stacked = nil
81
83
  @returned = nil
@@ -188,6 +190,13 @@ module Smartware
188
190
  when IDLING
189
191
  if @enabled_types == 0
190
192
  @connection.command(ENABLE_BILL_TYPES, "\x00" * 6) {}
193
+
194
+ begin
195
+ @closed.call
196
+ rescue => e
197
+ Logging.logger.error "Error in open: #{e}"
198
+ e.backtrace.each { |line| Logging.logger.error line }
199
+ end
191
200
  end
192
201
 
193
202
  when UNIT_DISABLED
@@ -219,6 +228,13 @@ module Smartware
219
228
  ]
220
229
 
221
230
  @connection.command(ENABLE_BILL_TYPES, mask.pack("C*")) {}
231
+
232
+ begin
233
+ @open.call
234
+ rescue => e
235
+ Logging.logger.error "Error in open: #{e}"
236
+ e.backtrace.each { |line| Logging.logger.error line }
237
+ end
222
238
  else
223
239
  interval = 0.5
224
240
  end
@@ -273,6 +289,13 @@ module Smartware
273
289
  EventMachine.add_timer(interval, &method(:poll))
274
290
  end
275
291
 
292
+ def insert_casette
293
+
294
+ end
295
+
296
+ def eject_casette
297
+
298
+ end
276
299
  end
277
300
  end
278
301
  end
@@ -6,18 +6,28 @@ module Smartware
6
6
  class Dummy
7
7
  attr_reader :bill_types
8
8
 
9
- attr_accessor :escrow, :stacked, :returned, :status
9
+ attr_accessor :open, :closed, :escrow, :stacked, :returned, :status
10
10
  attr_accessor :enabled_types
11
11
 
12
12
  def initialize(config)
13
- @bill_types = []
13
+ @bill_types = [ 10, 50, 100, 500, 5000 ].map do |value|
14
+ Interface::CashAcceptor::BillType.new(value, 'RUS')
15
+ end
14
16
 
17
+ @open = nil
18
+ @closed = nil
15
19
  @escrow = nil
16
20
  @stacked = nil
17
21
  @returned = nil
18
22
  @status = nil
23
+ @escrow_bill = nil
24
+ @casette = true
19
25
 
20
- @enabled_types = nil
26
+ @enabled_types = 0
27
+
28
+ EventMachine.add_periodic_timer 0.5, method(:poll)
29
+
30
+ @dummy_state = :power_up
21
31
  end
22
32
 
23
33
  def model
@@ -27,8 +37,81 @@ module Smartware
27
37
  def version
28
38
  "1.0"
29
39
  end
30
- end
31
40
 
41
+ def accepting?
42
+ false
43
+ end
44
+
45
+ def insert_casette
46
+ @casette = true
47
+ end
48
+
49
+ def eject_casette
50
+ @casette = false
51
+ end
52
+
53
+ private
54
+
55
+ def poll
56
+ error = nil
57
+
58
+ case @dummy_state
59
+ when :power_up
60
+ @dummy_state = :initialize
61
+
62
+ when :initialize
63
+ @dummy_state = :disabled
64
+
65
+ when :disabled
66
+ if !@casette
67
+ @dummy_state = :no_casette
68
+ elsif @enabled_types != 0
69
+ @dummy_state = :idle
70
+ @open.call
71
+ end
72
+
73
+ when :idle
74
+ if @enabled_types == 0
75
+ @dummy_state = :disabled
76
+ @closed.call
77
+ elsif !@casette
78
+ @dummy_state = :no_casette
79
+ else
80
+ bill, index = @bill_types.each_with_index
81
+ .select { |(obj, index)| enabled_types & (1 << index) != 0 }
82
+ .sample
83
+
84
+
85
+ @dummy_state = :escrow
86
+ @escrow_bill = bill
87
+ end
88
+
89
+ when :escrow
90
+ if @escrow.call(@escrow_bill)
91
+ @dummy_state = :stacking
92
+ else
93
+ @dummy_state = :returning
94
+ end
95
+
96
+ when :stacking
97
+ @dummy_state = :idle
98
+ @stacked.call @escrow_bill
99
+
100
+ when :returning
101
+ @dummy_state = :idle
102
+ @return.call @escrow_bill
103
+
104
+ when :no_casette
105
+ error = Interface::CashAcceptor::DROP_CASETTE_OUT_OF_POSITION
106
+
107
+ if @casette
108
+ @dummy_state = :disabled
109
+ end
110
+ end
111
+
112
+ @status.call error
113
+ end
114
+ end
32
115
  end
33
116
  end
34
117
  end
@@ -18,65 +18,116 @@ module Smartware
18
18
  end
19
19
  end
20
20
 
21
- def initialize(config)
21
+ def initialize(config, service)
22
22
  super
23
23
 
24
- @status[:model] = @device.model
25
- @status[:version] = @device.version
24
+ update_status :model, @device.model
25
+ update_status :version, @device.version
26
+ update_status :card_inserted, false, nil, nil, nil
27
+
28
+ @state = :inactive
29
+ @open = false
30
+ @mutex = Mutex.new
31
+ @cvar = ConditionVariable.new
32
+
33
+ schedule_status
26
34
  end
27
35
 
28
- def card_inserted?
29
- @device.status == :card_inserted
30
- rescue CardReaderError => e
31
- @status[:error] = e.code
32
- nil
36
+ def open
37
+ @mutex.synchronize do
38
+ @open = true
39
+ @cvar.wait(@mutex)
40
+ end
33
41
  end
34
42
 
35
- def start_accepting
36
- @device.accepting = true
37
- @status[:error] = nil
38
- true
39
- rescue CardReaderError => e
40
- @status[:error] = e.code
41
- false
43
+ def close
44
+ @mutex.synchronize do
45
+ @open = false
46
+ @cvar.wait(@mutex)
47
+ end
42
48
  end
43
49
 
44
- def stop_accepting
45
- @device.accepting = false
46
- @status[:error] = nil
47
- true
48
- rescue CardReaderError => e
49
- @status[:error] = e.code
50
- false
50
+ def card_inserted
51
+ @status[:card_inserted]
51
52
  end
52
53
 
53
- def eject
54
- @device.eject
54
+ private
55
55
 
56
- sleep 0.5 while @device.status == :card_at_gate
56
+ def poll
57
+ open = nil
58
+ @mutex.synchronize do
59
+ open = @open
60
+ @cvar.broadcast
61
+ end
57
62
 
58
- @status[:error] = nil
59
- true
60
- rescue CardReaderError => e
61
- @status[:error] = e.code
62
- false
63
- end
63
+ begin
64
+ status = @device.status
64
65
 
65
- def capture
66
- @device.capture
67
- @status[:error] = nil
68
- true
69
- rescue CardReaderError => e
70
- @status[:error] = e.code
71
- false
72
- end
66
+ case @state
67
+ when :failure
68
+ if status == :ready
69
+ @state = :inactive
70
+ update_status :error, nil
71
+ end
72
+
73
+ when :inactive
74
+ if open
75
+ @device.accepting = true
76
+ @state = :waiting_card
77
+ end
78
+
79
+ when :waiting_card
80
+ if !open
81
+ @device.accepting = false
82
+ @device.eject rescue nil
83
+ @state = :waiting_eject
73
84
 
74
- def read_magstrip
75
- @device.read_magstrip
85
+ elsif status == :card_inserted
86
+ @state = :card_inside
87
+ @device.accepting = false
76
88
 
77
- rescue CardReaderError => e
78
- @status[:error] = e.code
79
- nil
89
+ track1, track2, = @device.read_magstrip
90
+ if track1.nil? || track2.nil?
91
+ @device.eject rescue nil
92
+ @state = :waiting_eject
93
+ else
94
+ update_status :card_inserted, true, false, track1, track2
95
+ end
96
+ end
97
+
98
+ when :card_inside
99
+ if !open || status != :card_inserted
100
+ update_status :card_inserted, false, nil, nil, nil
101
+ @device.eject rescue nil
102
+ @state = :waiting_eject
103
+ end
104
+
105
+ when :waiting_eject
106
+ if status == :ready || status == :not_ready
107
+ if open
108
+ @state = :waiting_card
109
+ @device.accepting = true
110
+ else
111
+ @state = :inactive
112
+ end
113
+ end
114
+ end
115
+ rescue CardReaderError => e
116
+ Logging.logger.error "Card reader error: #{e}"
117
+
118
+ @device.eject rescue nil
119
+ @device.accepting = false rescue nil
120
+
121
+ @state = :failure
122
+ update_status :error, e.code
123
+ end
124
+ end
125
+
126
+ def schedule_status(ret = nil)
127
+ EventMachine.add_timer(0.1) do
128
+ EventMachine.defer(method(:poll),
129
+ method(:schedule_status))
130
+ end
80
131
  end
81
132
  end
82
133
  end
@@ -33,9 +33,11 @@ module Smartware
33
33
  end
34
34
  end
35
35
 
36
- def initialize(config)
36
+ def initialize(config, service)
37
37
  super
38
38
 
39
+ @device.open = method :device_open
40
+ @device.closed = method :device_closed
39
41
  @device.escrow = method :escrow
40
42
  @device.stacked = method :stacked
41
43
  @device.returned = method :returned
@@ -45,9 +47,8 @@ module Smartware
45
47
  @banknotes = {}
46
48
  @banknotes.default = 0
47
49
 
48
- update_status do
49
- @status[:casette] = true
50
- end
50
+ update_status :casette, false
51
+ update_status :accepting, false
51
52
 
52
53
  Smartware::Logging.logger.info "Cash acceptor monitor started"
53
54
  end
@@ -90,7 +91,7 @@ module Smartware
90
91
  end
91
92
 
92
93
  def banknotes
93
- update_status { @banknotes }
94
+ @banknotes
94
95
  end
95
96
 
96
97
  def cashsum
@@ -99,6 +100,14 @@ module Smartware
99
100
  end
100
101
  end
101
102
 
103
+ def insert_casette
104
+ @device.insert_casette
105
+ end
106
+
107
+ def eject_casette
108
+ @device.eject_casette
109
+ end
110
+
102
111
  private
103
112
 
104
113
  def limit_satisfied?(sum)
@@ -112,11 +121,11 @@ module Smartware
112
121
  def stacked(banknote)
113
122
  value = banknote.value
114
123
 
115
- update_status do
116
- @banknotes[value] += 1
117
- end
124
+ @banknotes[value] += 1
118
125
 
119
126
  Smartware::Logging.logger.debug "cash acceptor: bill stacked, #{value}"
127
+
128
+ publish_event :stacked, value
120
129
  end
121
130
 
122
131
  def returned(banknote)
@@ -126,12 +135,23 @@ module Smartware
126
135
  end
127
136
 
128
137
  def status_changed(error)
129
- update_status do
130
- @status[:error] = error
131
- @status[:model] = @device.model
132
- @status[:version] = @device.version
133
- @status[:casette] = error != DROP_CASETTE_OUT_OF_POSITION
134
- end
138
+ update_status :error, error
139
+ update_status :model, @device.model
140
+ update_status :version, @device.version
141
+ update_status :casette, error != DROP_CASETTE_OUT_OF_POSITION
142
+ update_status :cashsum, cashsum
143
+ end
144
+
145
+ def device_open
146
+ Smartware::Logging.logger.debug "Device acknowleged open"
147
+
148
+ update_status :accepting, true
149
+ end
150
+
151
+ def device_closed
152
+ Smartware::Logging.logger.debug "Device acknowleged close"
153
+
154
+ update_status :accepting, false
135
155
  end
136
156
  end
137
157
  end
@@ -3,34 +3,47 @@ module Smartware
3
3
  class Interface
4
4
  attr_reader :config
5
5
 
6
- def initialize(config)
6
+ def initialize(config, service)
7
7
  @config = config
8
+ @service = service
9
+
8
10
  @status_mutex = Mutex.new
9
11
  @status = {
10
- model: '',
11
- version: ''
12
+ error: [ nil ],
13
+ model: [ '' ],
14
+ version: [ '' ]
12
15
  }
13
16
 
14
17
  iface = @config["name"]
15
18
  driver = @config["driver"]
16
19
 
17
- require "smartware/drivers/#{iface.underscore}/#{driver.underscore}"
20
+ @iface_id = iface.underscore
21
+
22
+ require "smartware/drivers/#{@iface_id}/#{driver.underscore}"
18
23
 
19
24
  @device = Smartware::Driver.const_get(iface.to_s)
20
25
  .const_get(driver.to_s)
21
26
  .new(config)
22
27
  end
23
28
 
29
+ def repush_events(connection)
30
+ @status_mutex.synchronize do
31
+ @status.each do |key, value|
32
+ connection.publish_event "#{@iface_id}.#{key}", *value
33
+ end
34
+ end
35
+ end
36
+
24
37
  def error
25
- self.status[:error]
38
+ self.status[:error][0]
26
39
  end
27
40
 
28
41
  def model
29
- self.status[:model]
42
+ self.status[:model][0]
30
43
  end
31
44
 
32
45
  def version
33
- self.status[:version]
46
+ self.status[:version][0]
34
47
  end
35
48
 
36
49
  def status
@@ -39,8 +52,17 @@ module Smartware
39
52
 
40
53
  protected
41
54
 
42
- def update_status(&block)
43
- @status_mutex.synchronize &block
55
+ def update_status(key, *value)
56
+ @status_mutex.synchronize do
57
+ if @status[key] != value
58
+ @status[key] = value
59
+ publish_event key, *value
60
+ end
61
+ end
62
+ end
63
+
64
+ def publish_event(key, *data)
65
+ @service.publish_event "#{@iface_id}.#{key}", *data
44
66
  end
45
67
  end
46
68
  end
@@ -3,24 +3,22 @@ module Smartware
3
3
  class Modem < Interface
4
4
  MODEM_NOT_AVAILABLE = 1
5
5
 
6
- def initialize(config)
6
+ def initialize(config, service)
7
7
  super
8
8
 
9
- update_status do
10
- @status[:balance] = ''
11
- @status[:signal_level] = ''
12
- end
9
+ update_status :balance, ''
10
+ update_status :signal_level, ''
13
11
 
14
12
  @session = Thread.new &method(:poll)
15
13
  Smartware::Logging.logger.info 'Modem monitor started'
16
14
  end
17
15
 
18
16
  def balance
19
- self.status[:balance]
17
+ self.status[:balance][0]
20
18
  end
21
19
 
22
20
  def signal_level
23
- self.status[:signal_level]
21
+ self.status[:signal_level][0]
24
22
  end
25
23
 
26
24
  private
@@ -30,13 +28,11 @@ module Smartware
30
28
  loop do
31
29
  @device.tick
32
30
 
33
- update_status do
34
- @status[:signal_level] = @device.signal_level
35
- @status[:model] = @device.model
36
- @status[:version] = @device.version
37
- @status[:error] = @device.error
38
- @status[:balance] = @device.balance
39
- end
31
+ update_status :signal_level, @device.signal_level
32
+ update_status :model, @device.model
33
+ update_status :version, @device.version
34
+ update_status :error, @device.error
35
+ update_status :balance, @device.balance
40
36
  end
41
37
  rescue => e
42
38
  Smartware::Logging.logger.error e.message
@@ -7,7 +7,7 @@ module Smartware
7
7
  OUT_OF_PAPER = 3
8
8
  PAPER_NEAR_END = 1000
9
9
 
10
- def initialize(config)
10
+ def initialize(config, service)
11
11
  super
12
12
 
13
13
  @printer_mutex = Mutex.new
@@ -89,11 +89,9 @@ EOS
89
89
 
90
90
  def query_printer
91
91
  @device.query
92
- update_status do
93
- @status[:error] = @device.error
94
- @status[:model] = @device.model
95
- @status[:version] = @device.version
96
- end
92
+ update_status :error, @device.error
93
+ update_status :model, @device.model
94
+ update_status :version, @device.version
97
95
  end
98
96
 
99
97
  def poll
@@ -4,22 +4,18 @@ module Smartware
4
4
 
5
5
  WATCHDOG_NOT_AVAILBLE = 1
6
6
 
7
- def initialize(config)
7
+ def initialize(config, service)
8
8
  super
9
9
 
10
- update_status do
11
- @status[:error] = nil
12
- @status[:model] = @device.model
13
- @status[:version] = @device.version
14
- end
10
+ update_status :error, nil
11
+ update_status :model, @device.model
12
+ update_status :version, @device.version
15
13
  end
16
14
 
17
15
  def reboot_modem
18
16
  @device.reboot_modem
19
17
 
20
- update_status do
21
- @status[:error] = @device.error
22
- end
18
+ update_status :error, @device.error
23
19
  end
24
20
  end
25
21
  end
@@ -0,0 +1,69 @@
1
+ require "em/protocols/line_protocol"
2
+
3
+ module Smartware
4
+ class PubSubClient
5
+ class PubSubHandler < EventMachine::Connection
6
+ include EventMachine::Protocols::LineProtocol
7
+
8
+ def initialize(client)
9
+ @client = client
10
+ end
11
+
12
+ def unbind
13
+ @client.broken
14
+ end
15
+
16
+ def receive_line(line)
17
+ data = JSON.load line
18
+
19
+ @client.deliver data["key"], *data["args"]
20
+ end
21
+ end
22
+
23
+ @@static_client = nil
24
+
25
+ def self.create_static_client
26
+ @@static_client = PubSubClient.new
27
+ end
28
+
29
+ def self.destroy_static_client
30
+ return if @@static_client.nil?
31
+ @@static_client.stop
32
+ @@static_client = nil
33
+ end
34
+
35
+ attr_accessor :receiver
36
+
37
+ def initialize(host = "localhost", port = 6100)
38
+ @host = host
39
+ @port = port
40
+ @reconnect_timer = nil
41
+ @connection = nil
42
+ end
43
+
44
+ def start
45
+ attempt if @connection.nil? && @reconnect_timer.nil?
46
+ end
47
+
48
+ def stop
49
+ @connection.close_connection unless @connection.nil?
50
+ EventMachine.cancel_timer @reconnect_timer unless @reconnect_timer.nil?
51
+ end
52
+
53
+ def broken
54
+ @connection = nil
55
+ @reconnect_timer = EventMachine.add_timer 1, &method(:attempt)
56
+ end
57
+
58
+ def deliver(key, *args)
59
+ @receiver.call key, *args
60
+ end
61
+
62
+ private
63
+
64
+ def attempt
65
+ @reconnect_timer = nil
66
+ @connection = EventMachine.connect @host, @port, PubSubHandler, self
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,49 @@
1
+ module Smartware
2
+ class PubSubServer
3
+ class PubSubConnection < EventMachine::Connection
4
+ def initialize(server)
5
+ @server = server
6
+ end
7
+
8
+ def post_init
9
+ @server.add_connection self
10
+ end
11
+
12
+ def unbind
13
+ @server.remove_connection self
14
+ end
15
+
16
+ def receive_data(data)
17
+
18
+ end
19
+
20
+ def publish_event(key, *args)
21
+ send_data(JSON.dump({ key: key, args: args }) + "\r\n")
22
+ end
23
+ end
24
+
25
+ attr_accessor :repush
26
+
27
+ def initialize(host, port)
28
+ @repush = nil
29
+ @connections = Set.new
30
+
31
+ EventMachine.start_server host, port, PubSubConnection, self
32
+ end
33
+
34
+ def add_connection(connection)
35
+ @connections.add connection
36
+ @repush.call connection
37
+ end
38
+
39
+ def remove_connection(connection)
40
+ @connections.delete connection
41
+ end
42
+
43
+ def publish_event(key, *args)
44
+ @connections.each do |connection|
45
+ connection.publish_event key, *args
46
+ end
47
+ end
48
+ end
49
+ end
@@ -5,15 +5,31 @@ module Smartware
5
5
  def initialize(config_file)
6
6
  @config = YAML.load File.read(config_file)
7
7
  @interfaces = []
8
+ @devices = []
8
9
  end
9
10
 
10
11
  def start
11
12
  EventMachine.epoll
12
13
  EventMachine.run do
13
- @interfaces = @config["interfaces"].map do |config|
14
- interface = Smartware::Interface.const_get(config['name']).new config
14
+ @event_channel = EventMachine::Channel.new
15
+ @event_channel.subscribe do |(key, args)|
16
+ @pubsub.publish_event key, *args
17
+ end
18
+
19
+ @pubsub = PubSubServer.new "localhost", (@config["pubsub_port"] || 6100)
20
+ @pubsub.repush = ->(connection) do
21
+ @devices.each do |device|
22
+ device.repush_events connection
23
+ end
24
+ end
15
25
 
16
- DRb::DRbServer.new config["uri"], interface
26
+ @config["interfaces"].each do |config|
27
+ interface = Smartware::Interface.const_get(config['name']).new config, self
28
+ @devices << interface
29
+
30
+ if config.include? "uri"
31
+ @interfaces << DRb::DRbServer.new(config["uri"], interface)
32
+ end
17
33
  end
18
34
 
19
35
  unless @config["connection_timeout"].nil?
@@ -29,13 +45,16 @@ module Smartware
29
45
  end
30
46
  end
31
47
  end
48
+ end
32
49
 
50
+ def publish_event(key, *args)
51
+ @event_channel.push [key, args]
33
52
  end
34
53
 
35
54
  def stop
36
55
  @interfaces.each &:stop_service
37
56
 
38
- EventMachine.stop_event_loop
57
+ EventMachine.stop
39
58
  end
40
59
 
41
60
  def join
@@ -45,4 +64,3 @@ module Smartware
45
64
  end
46
65
  end
47
66
  end
48
-
@@ -1,3 +1,3 @@
1
1
  module Smartware
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartware
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-25 00:00:00.000000000 Z
13
+ date: 2013-02-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: smartkiosk-common
@@ -146,6 +146,7 @@ email:
146
146
  - boris@roundlake.ru
147
147
  executables:
148
148
  - smartware
149
+ - smartware-monitor
149
150
  - smartware-ppp-helper
150
151
  extensions: []
151
152
  extra_rdoc_files: []
@@ -156,6 +157,7 @@ files:
156
157
  - README.md
157
158
  - Rakefile
158
159
  - bin/smartware
160
+ - bin/smartware-monitor
159
161
  - bin/smartware-ppp-helper
160
162
  - config/smartware.yml.sample
161
163
  - lib/smartware.rb
@@ -186,6 +188,8 @@ files:
186
188
  - lib/smartware/interfaces/watchdog.rb
187
189
  - lib/smartware/logging.rb
188
190
  - lib/smartware/process_manager.rb
191
+ - lib/smartware/pub_sub_client.rb
192
+ - lib/smartware/pub_sub_server.rb
189
193
  - lib/smartware/service.rb
190
194
  - lib/smartware/version.rb
191
195
  - smartware.gemspec