tag-it 0.2.2 → 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.
data/README.rdoc CHANGED
@@ -47,10 +47,18 @@ And then attaching it to a tag-it tag_tracker like this:
47
47
  tracher.add_observer(watcher)
48
48
  tracker.start!
49
49
 
50
- the tracker will run indefinately, pulling in tag ids as they come into range and leave the area, and dispatch the necessary events. It also will dispatch a "pulse" event every 3 minutes so you know that the client is still running. Right now there are 3 events -- :tag_arrived when the tag comes into range, :tag_departed when it leaves, and the :pulse event every three minutes. The other parameters to the update method are the tag id ("1nrw") and the Relative Signal Strength (an integer: 34, 86, etc) indicating how close to the source the tag is.
50
+ the tracker will run indefinitely, pulling in tag ids as they come into range and leave the area, and dispatch the necessary events. It also will dispatch a "pulse" event every 3 minutes so you know that the client is still running. Right now there are 3 events -- :tag_arrived when the tag comes into range, :tag_departed when it leaves, and the :pulse event every three minutes. The other parameters to the update method are the tag id ("1nrw") and the Relative Signal Strength (an integer: 34, 86, etc) indicating how close to the source the tag is.
51
51
 
52
52
  ATTENTION!: In the "pulse" event, the tag parameter will actually be an array of currently in-range tags
53
53
 
54
+ As of version 0.3.0, you don't have to use the tracker. If you just want to fetch a quick snapshot of all tags currently in range, the TagIt TagSnapshot will do the trick:
55
+
56
+ require "tag_it"
57
+ port = SerialPort.new("/dev/tty.yourport",{:baud=>9600})
58
+ snapshot = TagIt::TagSnapshot.new(port)
59
+ tags = snapshot.shoot!
60
+ # tags => ["1nri","1okD","1nrP"]
61
+
54
62
  Happy Tagging!
55
63
 
56
64
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.1
data/lib/tag_it.rb CHANGED
@@ -1,7 +1,12 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  require 'serialport'
4
- require 'tag_it/tag_tracker'
4
+
5
+ module TagIt
6
+ autoload :TagTracker,"tag_it/tag_tracker.rb"
7
+ autoload :TagSnapshot,"tag_it/tag_snapshot.rb"
8
+ autoload :Monitor,"tag_it/monitor.rb"
9
+ end
5
10
 
6
11
  # port = SerialPort.new("/dev/tty.usbserial",:baud=>9600,:data_bits=>8,:stop_bits=>1)
7
12
  #
@@ -0,0 +1,45 @@
1
+ module TagIt
2
+ class Monitor
3
+ attr_accessor :port
4
+
5
+ def initialize(local_port)
6
+ self.port = local_port
7
+ @last_pulse = Time.now
8
+ end
9
+
10
+ def monitor_tags
11
+ char = nil
12
+ tag_name = ""
13
+ #dont start reporting until after the first space,
14
+ #so we don't have to deal with partial tagnames
15
+ clean_start_flag = false
16
+
17
+ #128 is the stop character we're adding so the tests can cutoff the loop.
18
+ while char != 128
19
+ # Don't take longer than 3 seconds to find a char, or there aren't any
20
+ Timeout::timeout(3) do
21
+ char = @port.getc
22
+ end
23
+ if char == 32
24
+ name,strength = split_tag_data(tag_name)
25
+ yield(name,strength) if clean_start_flag
26
+ tag_name = ""
27
+ clean_start_flag = true #here's a space, start sending tags
28
+ else
29
+ tag_name = "#{tag_name}#{char.chr}"
30
+ end
31
+ if ((Time.now - 180) > @last_pulse)
32
+ self.pulse!
33
+ end
34
+ end
35
+ end
36
+
37
+ def split_tag_data(tag_name)
38
+ [tag_name[0,4],tag_name[4,tag_name.size - 4].to_i]
39
+ end
40
+
41
+ def pulse!
42
+ #do nothing, you can override in a subclass if you want to fire an event or something
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ module TagIt
2
+ class TagSnapshot < TagIt::Monitor
3
+
4
+ def shoot!
5
+ tags = []
6
+ begin
7
+ monitor_tags do |tag_name,strength|
8
+ return tags if !tags.index(tag_name).nil?
9
+ tags << tag_name
10
+ end
11
+ rescue Timeout::Error
12
+ #do nothing, let tags return
13
+ end
14
+ tags
15
+ end
16
+ end
17
+ end
@@ -2,51 +2,27 @@ require "observer"
2
2
  require "timeout"
3
3
 
4
4
  module TagIt
5
- class TagTracker
5
+ class TagTracker < TagIt::Monitor
6
6
  include Observable
7
7
  include Timeout
8
8
 
9
9
  def initialize(port)
10
- @port = port
10
+ super(port)
11
11
  @tag_map ||= {}
12
- @last_pulse = Time.now
13
12
  end
14
13
 
15
14
  def start!
16
- char = nil
17
- tag_name = ""
18
-
19
- #dont start reporting until after the first space,
20
- #so we don't have to deal with partial tagnames
21
- clean_start_flag = false
22
-
23
- #128 is the stop character we're adding so the tests can cutoff the loop.
24
- #Production will loop infinitely until shutdown
25
- while char != 128
26
- begin
27
- # Don't take longer than 3 seconds to find a char, or there aren't any
28
- Timeout::timeout(3) do
29
- char = @port.getc
30
- end
31
- if char == 32
32
- flush_tag!(tag_name) if clean_start_flag #don't send until after first space
33
- depart_dormant_tags!
34
- tag_name = ""
35
- clean_start_flag = true #here's a space, start sending tags
36
- else
37
- tag_name = "#{tag_name}#{char.chr}"
38
- end
39
- rescue Timeout::Error
40
- depart_all_tags!
15
+ begin
16
+ monitor_tags do |tag_name,strength|
17
+ flush_tag!(tag_name,strength)
18
+ depart_dormant_tags!
41
19
  end
42
- if ((Time.now - 180) > @last_pulse)
43
- pulse!
44
- end
20
+ rescue Timeout::Error
21
+ depart_all_tags!
45
22
  end
46
23
  end
47
24
 
48
- def flush_tag!(tag_name)
49
- tag_name,strength = split_tag_data(tag_name)
25
+ def flush_tag!(tag_name,strength)
50
26
  if @tag_map[tag_name].nil?
51
27
  changed
52
28
  notify_observers(tag_name,strength,:tag_arrived)
@@ -75,10 +51,6 @@ module TagIt
75
51
  end
76
52
  end
77
53
 
78
- def split_tag_data(tag_name)
79
- [tag_name[0,4],tag_name[4,tag_name.size - 4].to_i]
80
- end
81
-
82
54
  def pulse!
83
55
  changed
84
56
  notify_observers(@tag_map.keys.sort,0,:pulse)
Binary file
data/tag-it.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{tag-it}
8
- s.version = "0.2.2"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["evizitei"]
12
- s.date = %q{2010-10-23}
12
+ s.date = %q{2010-11-22}
13
13
  s.description = %q{Interacting with RFID receivers through serial ports is not much fun. This makes it a little better. tag-it provides a class that will monitor a serial port for you, and will dispatch events through ruby's standard "observer" functionality when a tag comes into range and leaves.}
14
14
  s.email = %q{ethan.vizitei@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -27,12 +27,16 @@ Gem::Specification.new do |s|
27
27
  "Rakefile",
28
28
  "VERSION",
29
29
  "lib/tag_it.rb",
30
+ "lib/tag_it/monitor.rb",
31
+ "lib/tag_it/tag_snapshot.rb",
30
32
  "lib/tag_it/tag_tracker.rb",
31
33
  "pkg/tag-it-0.1.0.gem",
32
34
  "pkg/tag-it-0.2.1.gem",
35
+ "pkg/tag-it-0.2.2.gem",
33
36
  "tag-it.gemspec",
34
37
  "test/helper.rb",
35
38
  "test/mock_serial_port.rb",
39
+ "test/test_tag_snapshot.rb",
36
40
  "test/test_tag_tracker.rb"
37
41
  ]
38
42
  s.homepage = %q{http://github.com/evizitei/tag-it}
@@ -43,6 +47,7 @@ Gem::Specification.new do |s|
43
47
  s.test_files = [
44
48
  "test/helper.rb",
45
49
  "test/mock_serial_port.rb",
50
+ "test/test_tag_snapshot.rb",
46
51
  "test/test_tag_tracker.rb"
47
52
  ]
48
53
 
@@ -0,0 +1,22 @@
1
+ require 'helper'
2
+
3
+ class TestTagSnapshot < Test::Unit::TestCase
4
+ context "TagSnapshot" do
5
+ should "report all tag names in range" do
6
+ data = " 1nri85 1nwP79 1okD01 "
7
+ snapshot = TagIt::TagSnapshot.new(MockSerialPort.new(data))
8
+ assert_equal ["1nri","1nwP","1okD"],snapshot.shoot!
9
+ end
10
+
11
+ should "return on repeat" do
12
+ data = " 1nri85 1nwP79 1okD01 1nri72 1nwP79 1okD01 "
13
+ snapshot = TagIt::TagSnapshot.new(MockSerialPort.new(data))
14
+ assert_equal ["1nri","1nwP","1okD"],snapshot.shoot!
15
+ end
16
+
17
+ should "return empty if no tags" do
18
+ snapshot = TagIt::TagSnapshot.new(TimeoutSerialPort.new(""))
19
+ assert_equal [],snapshot.shoot!
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tag-it
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 2
10
- version: 0.2.2
8
+ - 3
9
+ - 1
10
+ version: 0.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - evizitei
@@ -15,12 +15,12 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-23 00:00:00 -05:00
18
+ date: 2010-11-22 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- type: :development
23
22
  prerelease: false
23
+ type: :development
24
24
  name: thoughtbot-shoulda
25
25
  version_requirements: &id001 !ruby/object:Gem::Requirement
26
26
  none: false
@@ -33,8 +33,8 @@ dependencies:
33
33
  version: "0"
34
34
  requirement: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- type: :development
37
36
  prerelease: false
37
+ type: :development
38
38
  name: test-unit
39
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
40
40
  none: false
@@ -47,8 +47,8 @@ dependencies:
47
47
  version: "0"
48
48
  requirement: *id002
49
49
  - !ruby/object:Gem::Dependency
50
- type: :development
51
50
  prerelease: false
51
+ type: :development
52
52
  name: mocha
53
53
  version_requirements: &id003 !ruby/object:Gem::Requirement
54
54
  none: false
@@ -61,8 +61,8 @@ dependencies:
61
61
  version: "0"
62
62
  requirement: *id003
63
63
  - !ruby/object:Gem::Dependency
64
- type: :development
65
64
  prerelease: false
65
+ type: :development
66
66
  name: timecop
67
67
  version_requirements: &id004 !ruby/object:Gem::Requirement
68
68
  none: false
@@ -75,8 +75,8 @@ dependencies:
75
75
  version: "0"
76
76
  requirement: *id004
77
77
  - !ruby/object:Gem::Dependency
78
- type: :runtime
79
78
  prerelease: false
79
+ type: :runtime
80
80
  name: ruby-serialport
81
81
  version_requirements: &id005 !ruby/object:Gem::Requirement
82
82
  none: false
@@ -108,12 +108,16 @@ files:
108
108
  - Rakefile
109
109
  - VERSION
110
110
  - lib/tag_it.rb
111
+ - lib/tag_it/monitor.rb
112
+ - lib/tag_it/tag_snapshot.rb
111
113
  - lib/tag_it/tag_tracker.rb
112
114
  - pkg/tag-it-0.1.0.gem
113
115
  - pkg/tag-it-0.2.1.gem
116
+ - pkg/tag-it-0.2.2.gem
114
117
  - tag-it.gemspec
115
118
  - test/helper.rb
116
119
  - test/mock_serial_port.rb
120
+ - test/test_tag_snapshot.rb
117
121
  - test/test_tag_tracker.rb
118
122
  has_rdoc: true
119
123
  homepage: http://github.com/evizitei/tag-it
@@ -152,4 +156,5 @@ summary: interaction with RFID receiver through a serial port.
152
156
  test_files:
153
157
  - test/helper.rb
154
158
  - test/mock_serial_port.rb
159
+ - test/test_tag_snapshot.rb
155
160
  - test/test_tag_tracker.rb