ant-wireless 0.1.0.pre.20210715102740 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.md +19 -0
- data/README.md +14 -2
- data/ext/ant_ext/ant_ext.c +71 -2
- data/ext/ant_ext/channel.c +119 -32
- data/ext/ant_ext/extconf.rb +1 -0
- data/lib/ant/bitvector.rb +197 -0
- data/lib/ant/channel/event_callbacks.rb +27 -22
- data/lib/ant/channel.rb +53 -7
- data/lib/ant/response_callbacks.rb +112 -338
- data/lib/ant-wireless.rb +7 -0
- data/lib/ant.rb +18 -5
- 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 +50 -8
- metadata.gz.sig +0 -0
@@ -13,8 +13,8 @@ require 'ant/mixins'
|
|
13
13
|
# Refs:
|
14
14
|
# * 9.5.6.1 Channel Response / Event (0x40) [ANT Message Protocol and Usage, Rev 5.1]
|
15
15
|
module Ant::Channel::EventCallbacks
|
16
|
-
extend Loggability
|
17
|
-
|
16
|
+
extend Loggability,
|
17
|
+
Ant::DataUtilities
|
18
18
|
|
19
19
|
|
20
20
|
# Mapping of response message IDs to handler methods
|
@@ -64,7 +64,7 @@ module Ant::Channel::EventCallbacks
|
|
64
64
|
|
65
65
|
### Default callback hook -- handles event callbacks.
|
66
66
|
def handle_event_callback( channel_num, event_id, data )
|
67
|
-
handler_method = HANDLER_METHODS[ event_id ] or
|
67
|
+
handler_method = Ant::Channel::EventCallbacks::HANDLER_METHODS[ event_id ] or
|
68
68
|
raise "Unhandled channel event %p" % [ event_id ]
|
69
69
|
|
70
70
|
if self.respond_to?( handler_method )
|
@@ -77,11 +77,10 @@ module Ant::Channel::EventCallbacks
|
|
77
77
|
|
78
78
|
### Handle an TX event.
|
79
79
|
def on_event_tx( channel_num, data )
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
# self.send_broadcast_data( data )
|
80
|
+
channel = Ant::Channel.registry[ channel_num ]
|
81
|
+
self.log.debug "%p ready for transmission." % [ channel ]
|
82
|
+
ident = [ 1, 33 ].pack( "CC" )
|
83
|
+
channel.send_broadcast_data( ident )
|
85
84
|
end
|
86
85
|
|
87
86
|
|
@@ -139,18 +138,27 @@ module Ant::Channel::EventCallbacks
|
|
139
138
|
end
|
140
139
|
|
141
140
|
|
142
|
-
|
143
|
-
|
144
|
-
|
141
|
+
def on_event_rx_flag_acknowledged( channel_num, data )
|
142
|
+
flags = data.bytes[ 9 ]
|
143
|
+
if flags & Ant::ANT_EXT_MESG_BITFIELD_DEVICE_ID
|
144
|
+
usDeviceNumber = data.bytes[10] | (data.bytes[11] << 8)
|
145
|
+
ucDeviceType = data.bytes[12]
|
146
|
+
ucTransmissionType = data.bytes[13]
|
147
|
+
self.log.debug "Got an acknowledge on Chan ID(%d/%d/%d)" %
|
148
|
+
[usDeviceNumber, ucDeviceType, ucTransmissionType]
|
149
|
+
end
|
150
|
+
|
151
|
+
self.on_event_rx_acknowledged( channel_num, data )
|
152
|
+
end
|
153
|
+
|
145
154
|
|
146
|
-
### Handle an RX_FLAG_BURST_PACKET event.
|
147
155
|
def on_event_rx_flag_burst_packet( channel_num, data )
|
148
156
|
flags = data.bytes[ 9 ]
|
149
157
|
if flags & Ant::ANT_EXT_MESG_BITFIELD_DEVICE_ID
|
150
158
|
usDeviceNumber = data.bytes[10] | (data.bytes[11] << 8)
|
151
159
|
ucDeviceType = data.bytes[12]
|
152
160
|
ucTransmissionType = data.bytes[13]
|
153
|
-
self.log.
|
161
|
+
self.log.debug "Got a burst on Chan ID(%d/%d/%d)" %
|
154
162
|
[usDeviceNumber, ucDeviceType, ucTransmissionType]
|
155
163
|
end
|
156
164
|
|
@@ -158,14 +166,13 @@ module Ant::Channel::EventCallbacks
|
|
158
166
|
end
|
159
167
|
|
160
168
|
|
161
|
-
### Handle an RX_FLAG_BROADCAST event.
|
162
169
|
def on_event_rx_flag_broadcast( channel_num, data )
|
163
170
|
flags = data.bytes[ 9 ]
|
164
171
|
if flags & Ant::ANT_EXT_MESG_BITFIELD_DEVICE_ID
|
165
172
|
usDeviceNumber = data.bytes[10] | (data.bytes[11] << 8)
|
166
173
|
ucDeviceType = data.bytes[12]
|
167
174
|
ucTransmissionType = data.bytes[13]
|
168
|
-
self.log.
|
175
|
+
self.log.debug "Got a broadcast on Chan ID(%d/%d/%d)" %
|
169
176
|
[usDeviceNumber, ucDeviceType, ucTransmissionType]
|
170
177
|
end
|
171
178
|
|
@@ -173,23 +180,21 @@ module Ant::Channel::EventCallbacks
|
|
173
180
|
end
|
174
181
|
|
175
182
|
|
176
|
-
|
177
|
-
|
178
|
-
|
183
|
+
def on_event_rx_acknowledged( channel_num, data )
|
184
|
+
self.log.debug "Acknowledged: Rx [%d]:\n%s" % [ data.bytes[0], Ant::DataUtilities.hexdump(data[1..9]) ]
|
185
|
+
end
|
179
186
|
|
180
187
|
|
181
|
-
### Handle an RX_BURST_PACKET event.
|
182
188
|
def on_event_rx_burst_packet( channel_num, data )
|
183
189
|
channel = (data.bytes[0] & CHANNEL_NUMBER_MASK) >> 5
|
184
190
|
sequence_num = data.bytes[0] & SEQUENCE_NUMBER_MASK
|
185
191
|
|
186
|
-
self.log.
|
192
|
+
self.log.debug "Burst (0x%02x): Rx: %d:\n%s" % [ channel, sequence_num, Ant::DataUtilities.hexdump(data[1..9]) ]
|
187
193
|
end
|
188
194
|
|
189
195
|
|
190
|
-
### Handle an RX_BROADCAST event.
|
191
196
|
def on_event_rx_broadcast( channel_num, data )
|
192
|
-
self.log.
|
197
|
+
self.log.debug "Broadcast: Rx [%d]:\n%s" % [ data.bytes[0], Ant::DataUtilities.hexdump(data[1..9]) ]
|
193
198
|
end
|
194
199
|
|
195
200
|
|
data/lib/ant/channel.rb
CHANGED
@@ -9,6 +9,7 @@ require 'ant' unless defined?( Ant )
|
|
9
9
|
class Ant::Channel
|
10
10
|
extend Loggability
|
11
11
|
|
12
|
+
|
12
13
|
# The default network number
|
13
14
|
DEFAULT_NETWORK_NUMBER = 0
|
14
15
|
|
@@ -20,7 +21,8 @@ class Ant::Channel
|
|
20
21
|
# Autoloads
|
21
22
|
#
|
22
23
|
|
23
|
-
|
24
|
+
require 'ant/channel/event_callbacks'
|
25
|
+
include Ant::Channel::EventCallbacks
|
24
26
|
|
25
27
|
|
26
28
|
# Loggability API -- log to the Ant logger
|
@@ -44,24 +46,68 @@ class Ant::Channel
|
|
44
46
|
|
45
47
|
|
46
48
|
### Set up the given +mod+ as the handler module for channel events.
|
47
|
-
def set_event_handlers(
|
48
|
-
self.
|
49
|
-
|
49
|
+
def set_event_handlers( object=self )
|
50
|
+
self.on_event( &object.method(:handle_event_callback) )
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
### Return the ANT channel ID if one has been assigned.
|
55
|
+
def channel_id
|
56
|
+
device_number = self.device_number or return nil
|
57
|
+
device_type = self.device_type & 0x7f
|
58
|
+
pairing_bit = self.device_type & 0x80
|
59
|
+
transmission_type = self.transmission_type
|
60
|
+
|
61
|
+
return "%d/%d/%d%s" % [
|
62
|
+
device_number,
|
63
|
+
device_type,
|
64
|
+
transmission_type,
|
65
|
+
pairing_bit.nonzero? ? '+' : '',
|
66
|
+
]
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
### Return a human-readable description of the channel type.
|
71
|
+
def channel_type_description
|
72
|
+
case self.channel_type
|
73
|
+
when Ant::PARAMETER_RX_NOT_TX
|
74
|
+
return :slave
|
75
|
+
when Ant::PARAMETER_TX_NOT_RX
|
76
|
+
return :master
|
77
|
+
when Ant::PARAMETER_SHARED_CHANNEL
|
78
|
+
return :shared
|
79
|
+
when Ant::PARAMETER_NO_TX_GUARD_BAND
|
80
|
+
return :no_tx_guard_band
|
81
|
+
when Ant::PARAMETER_ALWAYS_RX_WILD_CARD_SEARCH_ID
|
82
|
+
return :always_rx_wild_card_search_id
|
83
|
+
when Ant::PARAMETER_RX_ONLY
|
84
|
+
return :rx_only
|
85
|
+
else
|
86
|
+
return nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
### Returns +true+ if the channel is not closed.
|
92
|
+
def open?
|
93
|
+
return !self.closed?
|
50
94
|
end
|
51
95
|
|
52
96
|
|
53
97
|
### Return a human-readable version of the object suitable for debugging.
|
54
98
|
def inspect
|
55
|
-
return "#<%p:%#x {%
|
99
|
+
return "#<%p:%#x %s {%s} #%d @%dMHz on network %d%s>" % [
|
56
100
|
self.class,
|
57
101
|
self.object_id,
|
102
|
+
self.channel_type_description,
|
103
|
+
self.channel_id || '-',
|
58
104
|
self.channel_number,
|
59
|
-
self.
|
105
|
+
self.rf_frequency + 2400,
|
60
106
|
self.network_number,
|
61
|
-
self.extended_options,
|
62
107
|
self.closed? ? " (closed)" : "",
|
63
108
|
]
|
64
109
|
end
|
65
110
|
|
66
111
|
end # class Ant::Channel
|
67
112
|
|
113
|
+
|