ant-wireless 0.1.0 → 0.4.0
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
- checksums.yaml.gz.sig +0 -0
- data/History.md +31 -0
- data/README.md +11 -1
- data/ext/ant_ext/ant_ext.c +178 -1
- data/ext/ant_ext/channel.c +198 -16
- data/ext/ant_ext/extconf.rb +10 -0
- data/lib/ant/bitvector.rb +197 -0
- data/lib/ant/channel/event_callbacks.rb +13 -17
- data/lib/ant/channel.rb +52 -5
- data/lib/ant/response_callbacks.rb +156 -323
- data/lib/ant.rb +76 -1
- data/spec/ant_spec.rb +9 -0
- data/spec/bitvector_spec.rb +141 -0
- data/spec/spec_helper.rb +2 -0
- data.tar.gz.sig +0 -0
- metadata +4 -2
- metadata.gz.sig +0 -0
data/lib/ant.rb
CHANGED
@@ -12,7 +12,7 @@ module Ant
|
|
12
12
|
extend Loggability
|
13
13
|
|
14
14
|
# Package version
|
15
|
-
VERSION = '0.
|
15
|
+
VERSION = '0.4.0'
|
16
16
|
|
17
17
|
# A Range for matching valid ANT device numbers
|
18
18
|
VALID_DEVICE_NUMBERS = ( 0...65535 ).freeze
|
@@ -26,6 +26,14 @@ module Ant
|
|
26
26
|
# The valid offsets for the "RF Frequency" setting; this is an offset from 2400Hz.
|
27
27
|
VALID_RF_FREQUENCIES = ( 0...124 ).freeze
|
28
28
|
|
29
|
+
# Default options for advanced burst when it's enabled.
|
30
|
+
DEFAULT_ADVANCED_OPTIONS = {
|
31
|
+
max_packet_length: 24,
|
32
|
+
frequency_hopping: :optional,
|
33
|
+
stall_count: 0,
|
34
|
+
retry_count: 0
|
35
|
+
}
|
36
|
+
|
29
37
|
|
30
38
|
# Loggability API -- set up a logger for the library
|
31
39
|
log_as :ant
|
@@ -35,6 +43,23 @@ module Ant
|
|
35
43
|
autoload :DataUtilities, 'ant/mixins'
|
36
44
|
|
37
45
|
|
46
|
+
# Capabilities hash -- set asynchronously by calling Ant.request_capabilities
|
47
|
+
@capabilities = nil
|
48
|
+
singleton_class.attr_reader( :capabilities )
|
49
|
+
|
50
|
+
# Serial number -- set asynchronously by calling Ant.request_serial_num
|
51
|
+
@serial_num = nil
|
52
|
+
singleton_class.attr_reader( :serial_num )
|
53
|
+
|
54
|
+
# Version of ANT supported by the hardware -- set asynchronously by calling
|
55
|
+
# Ant.request_version
|
56
|
+
@hardware_version = nil
|
57
|
+
singleton_class.attr_reader( :hardware_version )
|
58
|
+
|
59
|
+
# Add some convenience aliases
|
60
|
+
singleton_class.alias_method( :is_initialized?, :initialized? )
|
61
|
+
|
62
|
+
|
38
63
|
### Set up the given +object+ as the handler for response callbacks. It must
|
39
64
|
### respond to :handle_response_callback.
|
40
65
|
def self::set_response_handler( object=Ant::ResponseCallbacks )
|
@@ -126,5 +151,55 @@ module Ant
|
|
126
151
|
return offset
|
127
152
|
end
|
128
153
|
|
154
|
+
|
155
|
+
### Enable advanced burst mode with the given +options+.
|
156
|
+
def self::enable_advanced_burst( **options )
|
157
|
+
options = DEFAULT_ADVANCED_OPTIONS.merge( options )
|
158
|
+
|
159
|
+
max_packet_length = self.convert_max_packet_length( options[:max_packet_length] )
|
160
|
+
|
161
|
+
required_fields = self.make_required_fields_config( options )
|
162
|
+
optional_fields = self.make_optional_fields_config( options )
|
163
|
+
|
164
|
+
stall_count = options[:stall_count]
|
165
|
+
retry_count = options[:retry_count]
|
166
|
+
|
167
|
+
self.configure_advanced_burst( true, max_packet_length, required_fields, optional_fields,
|
168
|
+
stall_count, retry_count )
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
### Validate that the specified +length+ (in bytes) is a valid setting as an
|
173
|
+
### advanced burst max packet length configuration value. Returns the equivalent
|
174
|
+
### configuration value.
|
175
|
+
def self::convert_max_packet_length( length )
|
176
|
+
case length
|
177
|
+
when 8 then return 0x01
|
178
|
+
when 16 then return 0x02
|
179
|
+
when 24 then return 0x03
|
180
|
+
else
|
181
|
+
raise ArgumentError,
|
182
|
+
"invalid max packet length; expected 8, 16, or 24, got %p" % [ length ]
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
### Given an options hash, return a configuration value for required fields.
|
188
|
+
def self::make_required_fields_config( **options )
|
189
|
+
value = 0
|
190
|
+
value |= 0x01 if options[:frequency_hopping] == :required
|
191
|
+
|
192
|
+
return value
|
193
|
+
end
|
194
|
+
|
195
|
+
|
196
|
+
### Given an options hash, return a configuration value for optional fields.
|
197
|
+
def self::make_optional_fields_config( **options )
|
198
|
+
value = 0
|
199
|
+
value |= 0x01 if options[:frequency_hopping] == :optional
|
200
|
+
|
201
|
+
return value
|
202
|
+
end
|
203
|
+
|
129
204
|
end # module Ant
|
130
205
|
|
data/spec/ant_spec.rb
CHANGED
@@ -33,6 +33,15 @@ RSpec.describe( Ant ) do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
|
36
|
+
it "knows if it's been initialized or not", :hardware do
|
37
|
+
expect( Ant ).to_not be_initialized
|
38
|
+
Ant.init
|
39
|
+
expect( Ant ).to be_initialized
|
40
|
+
Ant.close
|
41
|
+
expect( Ant ).to_not be_initialized
|
42
|
+
end
|
43
|
+
|
44
|
+
|
36
45
|
it "can validate a device number" do
|
37
46
|
expect( described_class.validate_device_number(111) ).to eq( 111 )
|
38
47
|
expect {
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative 'spec_helper'
|
5
|
+
|
6
|
+
require 'ant/bitvector'
|
7
|
+
|
8
|
+
|
9
|
+
RSpec.describe( Ant::BitVector ) do
|
10
|
+
|
11
|
+
context 'when first instantiated' do
|
12
|
+
|
13
|
+
it "is empty when created without arguments" do
|
14
|
+
v = described_class.new
|
15
|
+
expect( v.to_i ).to eq( 0 )
|
16
|
+
expect( v.size ).to eq( 1 )
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
it "accepts a decimal argument" do
|
21
|
+
v = described_class.new( 242 )
|
22
|
+
expect( v.to_hex ).to eq( '0x00f2' )
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
it "accepts a hexadecimal argument" do
|
27
|
+
v = described_class.new( 0x00f2 )
|
28
|
+
expect( v.to_i ).to eq( 242 )
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
it "accepts a bit string argument" do
|
33
|
+
v = described_class.new( 0b11110010 )
|
34
|
+
expect( v.to_i ).to eq( 242 )
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
it "accepts a different BitVector argument" do
|
39
|
+
v = described_class.new( described_class.new( 242 ) )
|
40
|
+
expect( v.to_i ).to eq( 242 )
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
it "accepts a string argument" do
|
45
|
+
v = described_class.new( "242" )
|
46
|
+
expect( v.to_i ).to eq( 242 )
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
it "rejects objects that don't have a 'to_i' method" do
|
51
|
+
expect {
|
52
|
+
described_class.new( Class )
|
53
|
+
}.to raise_error( ArgumentError, /don't know what to do/i )
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
context 'after modified with a value' do
|
60
|
+
|
61
|
+
let( :bv ) { described_class.new( 242 ) }
|
62
|
+
|
63
|
+
|
64
|
+
it "can be converted into various formats" do
|
65
|
+
expect( bv.to_int ).to eq( 242 )
|
66
|
+
expect( bv.to_hex ).to eq( '0x00f2' )
|
67
|
+
expect( bv.to_bin ).to eq( '0b11110010' )
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
it "knows the size of its own bit string" do
|
72
|
+
expect( bv.size ).to eq( 8 )
|
73
|
+
bv.toggle( 9 )
|
74
|
+
expect( bv.size ).to eq( 10 )
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
it "can switch specific bits on and off" do
|
79
|
+
expect( bv.on?( 12 ) ).to be_falsey
|
80
|
+
|
81
|
+
bv.on( 12 )
|
82
|
+
expect( bv[12] ).to be_truthy
|
83
|
+
|
84
|
+
bv.off( 12 )
|
85
|
+
expect( bv.off?( 12 ) ).to be_truthy
|
86
|
+
|
87
|
+
bv[12] = true
|
88
|
+
expect( bv.on?( 12 ) ).to be_truthy
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
it "can set bits in a range" do
|
93
|
+
expect( bv[ 8] ).to be_falsey
|
94
|
+
expect( bv[ 9] ).to be_falsey
|
95
|
+
expect( bv[10] ).to be_falsey
|
96
|
+
expect( bv[11] ).to be_falsey
|
97
|
+
expect( bv[12] ).to be_falsey
|
98
|
+
|
99
|
+
bv[8..12] = true
|
100
|
+
|
101
|
+
expect( bv[ 8] ).to be_truthy
|
102
|
+
expect( bv[ 9] ).to be_truthy
|
103
|
+
expect( bv[10] ).to be_truthy
|
104
|
+
expect( bv[11] ).to be_truthy
|
105
|
+
expect( bv[12] ).to be_truthy
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
it "delegates math operations to the underlying integer" do
|
110
|
+
bv2 = described_class.new( 4112 )
|
111
|
+
|
112
|
+
bv3 = bv + bv2
|
113
|
+
expect( bv3.to_int ).to eq( 4354 )
|
114
|
+
|
115
|
+
bv3 = bv | bv2
|
116
|
+
expect( bv3.to_int ).to eq( 4338 )
|
117
|
+
|
118
|
+
bv3 = bv & bv2
|
119
|
+
expect( bv3.to_int ).to eq( 16 )
|
120
|
+
|
121
|
+
expect( bv3 ).to be_a( described_class )
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
it "can compare different bitvector objects" do
|
126
|
+
bv1 = described_class.new( bv )
|
127
|
+
bv2 = described_class.new( 4112 )
|
128
|
+
expect( bv ).to eq( bv1 )
|
129
|
+
expect( bv ).to be < bv2
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
it "is enumerable" do
|
134
|
+
bits = bv.to_a
|
135
|
+
expect( bits ).to eq( [0, 1, 0, 0, 1, 1, 1, 1] )
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
data/spec/spec_helper.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ant-wireless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
MCh97sQ/Z/MOusb5+QddBmB+k8EicXyGNl4b5L4XpL7fIQu+Y96TB3JEJlShxFD9
|
35
35
|
k9FjI4d9EP54gS/4
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date: 2021-
|
37
|
+
date: 2021-11-05 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: rake-compiler
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- ext/ant_ext/version.h
|
107
107
|
- lib/ant-wireless.rb
|
108
108
|
- lib/ant.rb
|
109
|
+
- lib/ant/bitvector.rb
|
109
110
|
- lib/ant/channel.rb
|
110
111
|
- lib/ant/channel/event_callbacks.rb
|
111
112
|
- lib/ant/message.rb
|
@@ -113,6 +114,7 @@ files:
|
|
113
114
|
- lib/ant/response_callbacks.rb
|
114
115
|
- lib/ant/wireless.rb
|
115
116
|
- spec/ant_spec.rb
|
117
|
+
- spec/bitvector_spec.rb
|
116
118
|
- spec/spec_helper.rb
|
117
119
|
homepage: https://sr.ht/~ged/ruby-ant-wireless/
|
118
120
|
licenses:
|
metadata.gz.sig
CHANGED
Binary file
|