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
@@ -4,11 +4,13 @@
|
|
4
4
|
require 'loggability'
|
5
5
|
|
6
6
|
require 'ant' unless defined?( Ant )
|
7
|
+
require 'ant/bitvector'
|
7
8
|
|
8
9
|
|
9
10
|
# A module that handles response callbacks by logging them.
|
10
11
|
module Ant::ResponseCallbacks
|
11
|
-
extend Loggability
|
12
|
+
extend Loggability,
|
13
|
+
Ant::DataUtilities
|
12
14
|
|
13
15
|
# Loggability API -- send logs to the Ant logger
|
14
16
|
log_to :ant
|
@@ -16,91 +18,53 @@ module Ant::ResponseCallbacks
|
|
16
18
|
|
17
19
|
# Mapping of response message IDs to handler methods
|
18
20
|
HANDLER_METHODS = {
|
21
|
+
Ant::Message::MESG_STARTUP_MESG_ID => :on_startup_mesg,
|
22
|
+
|
23
|
+
Ant::Message::MESG_CAPABILITIES_ID => :on_capabilities,
|
24
|
+
Ant::Message::MESG_CHANNEL_STATUS_ID => :on_channel_status,
|
19
25
|
Ant::Message::MESG_VERSION_ID => :on_version,
|
26
|
+
Ant::Message::MESG_CHANNEL_ID_ID => :on_channel_id,
|
27
|
+
Ant::Message::MESG_EVENT_BUFFERING_CONFIG_ID => :on_event_buffering_config,
|
28
|
+
Ant::Message::MESG_GET_SERIAL_NUM_ID => :on_get_serial_num,
|
29
|
+
|
20
30
|
Ant::Message::MESG_RESPONSE_EVENT_ID => :on_response_event,
|
21
31
|
|
22
|
-
Ant::Message::
|
32
|
+
Ant::Message::MESG_NETWORK_KEY_ID => :on_network_key,
|
23
33
|
Ant::Message::MESG_ASSIGN_CHANNEL_ID => :on_assign_channel,
|
24
|
-
Ant::Message::
|
25
|
-
Ant::Message::MESG_CHANNEL_SEARCH_TIMEOUT_ID => :on_channel_search_timeout,
|
34
|
+
Ant::Message::MESG_UNASSIGN_CHANNEL_ID => :on_unassign_channel,
|
26
35
|
Ant::Message::MESG_CHANNEL_RADIO_FREQ_ID => :on_channel_radio_freq,
|
27
|
-
Ant::Message::MESG_NETWORK_KEY_ID => :on_network_key,
|
28
|
-
Ant::Message::MESG_RADIO_TX_POWER_ID => :on_radio_tx_power,
|
29
|
-
Ant::Message::MESG_RADIO_CW_MODE_ID => :on_radio_cw_mode,
|
30
|
-
Ant::Message::MESG_SYSTEM_RESET_ID => :on_system_reset,
|
31
36
|
Ant::Message::MESG_OPEN_CHANNEL_ID => :on_open_channel,
|
37
|
+
|
38
|
+
Ant::Message::MESG_RX_EXT_MESGS_ENABLE_ID => :on_rx_ext_mesgs_enable,
|
32
39
|
Ant::Message::MESG_CLOSE_CHANNEL_ID => :on_close_channel,
|
33
40
|
Ant::Message::MESG_REQUEST_ID => :on_request,
|
34
41
|
|
35
42
|
Ant::Message::MESG_BROADCAST_DATA_ID => :on_broadcast_data,
|
36
43
|
Ant::Message::MESG_ACKNOWLEDGED_DATA_ID => :on_acknowledged_data,
|
37
44
|
Ant::Message::MESG_BURST_DATA_ID => :on_burst_data,
|
45
|
+
Ant::Message::MESG_ADV_BURST_DATA_ID => :on_adv_burst_data,
|
38
46
|
|
39
|
-
Ant::Message::
|
40
|
-
Ant::Message::
|
41
|
-
Ant::Message::MESG_RADIO_CW_INIT_ID => :on_radio_cw_init,
|
42
|
-
Ant::Message::MESG_CAPABILITIES_ID => :on_capabilities,
|
43
|
-
|
44
|
-
Ant::Message::MESG_STACKLIMIT_ID => :on_stacklimit,
|
45
|
-
|
46
|
-
Ant::Message::MESG_SCRIPT_DATA_ID => :on_script_data,
|
47
|
-
Ant::Message::MESG_SCRIPT_CMD_ID => :on_script_cmd,
|
48
|
-
|
49
|
-
Ant::Message::MESG_ID_LIST_ADD_ID => :on_id_list_add,
|
50
|
-
Ant::Message::MESG_CRYPTO_ID_LIST_ADD_ID => :on_crypto_id_list_add,
|
51
|
-
Ant::Message::MESG_ID_LIST_CONFIG_ID => :on_id_list_config,
|
52
|
-
Ant::Message::MESG_CRYPTO_ID_LIST_CONFIG_ID => :on_crypto_id_list_config,
|
53
|
-
Ant::Message::MESG_OPEN_RX_SCAN_ID => :on_open_rx_scan,
|
47
|
+
Ant::Message::MESG_CHANNEL_MESG_PERIOD_ID => :on_channel_mesg_period,
|
48
|
+
Ant::Message::MESG_CHANNEL_SEARCH_TIMEOUT_ID => :on_channel_search_timeout,
|
54
49
|
|
55
|
-
Ant::Message::
|
56
|
-
Ant::Message::MESG_EXT_BROADCAST_DATA_ID => :on_ext_broadcast_data,
|
57
|
-
Ant::Message::MESG_EXT_ACKNOWLEDGED_DATA_ID => :on_ext_acknowledged_data,
|
58
|
-
Ant::Message::MESG_EXT_BURST_DATA_ID => :on_ext_burst_data,
|
50
|
+
Ant::Message::MESG_RADIO_TX_POWER_ID => :on_radio_tx_power,
|
59
51
|
|
60
|
-
Ant::Message::MESG_CHANNEL_RADIO_TX_POWER_ID => :on_channel_radio_tx_power,
|
61
|
-
Ant::Message::MESG_GET_SERIAL_NUM_ID => :on_get_serial_num,
|
62
|
-
Ant::Message::MESG_GET_TEMP_CAL_ID => :on_get_temp_cal,
|
63
|
-
Ant::Message::MESG_SET_LP_SEARCH_TIMEOUT_ID => :on_set_lp_search_timeout,
|
64
|
-
Ant::Message::MESG_SET_TX_SEARCH_ON_NEXT_ID => :on_set_tx_search_on_next,
|
65
|
-
Ant::Message::MESG_SERIAL_NUM_SET_CHANNEL_ID_ID => :on_serial_num_set_channel_id,
|
66
|
-
Ant::Message::MESG_RX_EXT_MESGS_ENABLE_ID => :on_rx_ext_mesgs_enable,
|
67
|
-
Ant::Message::MESG_RADIO_CONFIG_ALWAYS_ID => :on_radio_config_always,
|
68
|
-
Ant::Message::MESG_ENABLE_LED_FLASH_ID => :on_enable_led_flash,
|
69
|
-
Ant::Message::MESG_XTAL_ENABLE_ID => :on_xtal_enable,
|
70
|
-
Ant::Message::MESG_ANTLIB_CONFIG_ID => :on_antlib_config,
|
71
|
-
Ant::Message::MESG_STARTUP_MESG_ID => :on_startup_mesg,
|
72
52
|
Ant::Message::MESG_AUTO_FREQ_CONFIG_ID => :on_auto_freq_config,
|
73
|
-
Ant::Message::
|
74
|
-
|
75
|
-
Ant::Message::MESG_ADV_BURST_DATA_ID => :on_adv_burst_data,
|
76
|
-
Ant::Message::MESG_EVENT_BUFFERING_CONFIG_ID => :on_event_buffering_config,
|
53
|
+
Ant::Message::MESG_CONFIG_ADV_BURST_ID => :on_config_adv_burst_id,
|
77
54
|
|
78
|
-
|
79
|
-
|
80
|
-
Ant::Message::MESG_HIGH_DUTY_SEARCH_MODE_ID => :on_high_duty_search_mode,
|
81
|
-
Ant::Message::MESG_CONFIG_ADV_BURST_ID => :on_config_adv_burst,
|
82
|
-
Ant::Message::MESG_EVENT_FILTER_CONFIG_ID => :on_event_filter_config,
|
83
|
-
Ant::Message::MESG_SDU_CONFIG_ID => :on_sdu_config,
|
84
|
-
Ant::Message::MESG_SDU_SET_MASK_ID => :on_sdu_set_mask,
|
85
|
-
Ant::Message::MESG_USER_CONFIG_PAGE_ID => :on_user_config_page,
|
86
|
-
Ant::Message::MESG_ENCRYPT_ENABLE_ID => :on_encrypt_enable,
|
87
|
-
Ant::Message::MESG_SET_CRYPTO_KEY_ID => :on_set_crypto_key,
|
88
|
-
Ant::Message::MESG_SET_CRYPTO_INFO_ID => :on_set_crypto_info,
|
89
|
-
Ant::Message::MESG_CUBE_CMD_ID => :on_cube_cmd,
|
90
|
-
|
91
|
-
Ant::Message::MESG_ACTIVE_SEARCH_SHARING_ID => :on_active_search_sharing,
|
92
|
-
Ant::Message::MESG_NVM_CRYPTO_KEY_OPS_ID => :on_nvm_crypto_key_ops,
|
55
|
+
# :TODO: There are many other MESG_ constants, but I think most or all of
|
56
|
+
# them are only used for the serial protocol.
|
93
57
|
}
|
94
58
|
|
95
59
|
|
96
60
|
|
97
61
|
### Default callback hook -- handles response callbacks.
|
98
62
|
def self::handle_response_callback( channel_num, message_id, data )
|
99
|
-
handler_method = HANDLER_METHODS[ message_id ] or
|
63
|
+
handler_method = Ant::ResponseCallbacks::HANDLER_METHODS[ message_id ] or
|
100
64
|
raise "Unhandled response message ID %p" % [ message_id ]
|
101
65
|
|
102
|
-
if self.respond_to?( handler_method )
|
103
|
-
self.
|
66
|
+
if self.respond_to?( handler_method, true )
|
67
|
+
self.send( handler_method, channel_num, data )
|
104
68
|
else
|
105
69
|
Ant::ResponseCallbacks.log_response_callback( channel_num, handler_method, message_id, data )
|
106
70
|
end
|
@@ -124,7 +88,9 @@ module Ant::ResponseCallbacks
|
|
124
88
|
|
125
89
|
### Handle version number response messages.
|
126
90
|
def on_version( channel_num, data )
|
127
|
-
|
91
|
+
version = data.strip
|
92
|
+
self.log.info "ANT Version %s" % [ version ]
|
93
|
+
Ant.instance_variable_set( :@hardware_version, version )
|
128
94
|
end
|
129
95
|
|
130
96
|
|
@@ -135,6 +101,19 @@ module Ant::ResponseCallbacks
|
|
135
101
|
end
|
136
102
|
|
137
103
|
|
104
|
+
### Log a success or an error message for a response event message.
|
105
|
+
def log_response_event( channel_num, data, err_desc, log_desc )
|
106
|
+
status = data.bytes[ 2 ]
|
107
|
+
channel = Ant::Channel.registry[ channel_num ]
|
108
|
+
|
109
|
+
if status.nonzero?
|
110
|
+
self.log.error "Error while %s on %p: %#02x" % [ err_desc, channel, status ]
|
111
|
+
else
|
112
|
+
self.log.info( log_desc )
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
|
138
117
|
### Handle startup response messages.
|
139
118
|
def on_startup_mesg( channel_num, data )
|
140
119
|
reason = case data.bytes[ 0 ]
|
@@ -166,13 +145,15 @@ module Ant::ResponseCallbacks
|
|
166
145
|
|
167
146
|
### Handle channel assignment event response messages.
|
168
147
|
def on_assign_channel( channel_num, data )
|
169
|
-
self.log_response_event( channel_num, data, "assigning channel",
|
148
|
+
self.log_response_event( channel_num, data, "assigning channel",
|
149
|
+
"Channel %d assigned." % [channel_num] )
|
170
150
|
end
|
171
151
|
|
172
152
|
|
173
153
|
### Handle channel unassignment event response messages.
|
174
|
-
def on_unassign_channel
|
175
|
-
self.log_response_event( channel_num, data, "unassigning channel",
|
154
|
+
def on_unassign_channel( channel_num, data )
|
155
|
+
self.log_response_event( channel_num, data, "unassigning channel",
|
156
|
+
"Channel %d unassigned." % [channel_num] )
|
176
157
|
end
|
177
158
|
|
178
159
|
|
@@ -201,328 +182,180 @@ module Ant::ResponseCallbacks
|
|
201
182
|
end
|
202
183
|
|
203
184
|
|
204
|
-
### Log a success or an error message for a response event message.
|
205
|
-
def log_response_event( channel_num, data, err_desc, log_desc )
|
206
|
-
status = data.bytes[ 2 ]
|
207
|
-
if status.nonzero?
|
208
|
-
self.log.error "Error while %s: %#02x" % [ err_desc, status ]
|
209
|
-
else
|
210
|
-
self.log.info( log_desc )
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
|
215
185
|
### Handle channel_mesg_period response events.
|
216
186
|
def on_channel_mesg_period( channel_num, data )
|
217
|
-
self.log_response_event( channel_num, data, "
|
187
|
+
self.log_response_event( channel_num, data, "setting channel period", "Channel period assigned." )
|
218
188
|
end
|
219
189
|
|
220
190
|
|
221
191
|
### Handle channel_search_timeout response event.
|
222
192
|
def on_channel_search_timeout( channel_num, data )
|
223
|
-
self.log_response_event( channel_num, data, "
|
193
|
+
self.log_response_event( channel_num, data, "setting search timeout", "Search timeout." )
|
224
194
|
end
|
225
195
|
|
226
196
|
|
227
197
|
### Handle radio_tx_power response event.
|
228
198
|
def on_radio_tx_power( channel_num, data )
|
229
|
-
self.log_response_event( channel_num, data, "
|
230
|
-
end
|
231
|
-
|
232
|
-
|
233
|
-
### Handle radio_cw_mode response event.
|
234
|
-
def on_radio_cw_mode( channel_num, data )
|
235
|
-
self.log_response_event( channel_num, data, "radio_cw_mode", "Channel assigned." )
|
236
|
-
end
|
237
|
-
|
238
|
-
|
239
|
-
### Handle system_reset response event.
|
240
|
-
def on_system_reset( channel_num, data )
|
241
|
-
self.log_response_event( channel_num, data, "system_reset", "Channel assigned." )
|
242
|
-
end
|
243
|
-
|
244
|
-
|
245
|
-
### Handle request response event.
|
246
|
-
def on_request( channel_num, data )
|
247
|
-
self.log_response_event( channel_num, data, "request", "Channel assigned." )
|
199
|
+
self.log_response_event( channel_num, data, "setting transmit power", "Transmit power changed." )
|
248
200
|
end
|
249
201
|
|
250
202
|
|
251
203
|
### Handle broadcast_data response event.
|
252
204
|
def on_broadcast_data( channel_num, data )
|
253
|
-
self.log_response_event( channel_num, data, "
|
205
|
+
self.log_response_event( channel_num, data, "sending broadcast data", "Sent broadcast data." )
|
254
206
|
end
|
255
207
|
|
256
208
|
|
257
209
|
### Handle acknowledged_data response event.
|
258
210
|
def on_acknowledged_data( channel_num, data )
|
259
|
-
self.log_response_event( channel_num, data, "
|
211
|
+
self.log_response_event( channel_num, data, "sending acked data", "Acked data sent." )
|
260
212
|
end
|
261
213
|
|
262
214
|
|
263
215
|
### Handle burst_data response event.
|
264
216
|
def on_burst_data( channel_num, data )
|
265
|
-
self.log_response_event( channel_num, data, "
|
217
|
+
self.log_response_event( channel_num, data, "sending burst data", "Burst data sent." )
|
266
218
|
end
|
267
219
|
|
268
220
|
|
269
221
|
### Handle channel_status response event.
|
270
222
|
def on_channel_status( channel_num, data )
|
271
|
-
self.log_response_event( channel_num, data, "
|
272
|
-
end
|
273
|
-
|
274
|
-
|
275
|
-
### Handle radio_cw_init response event.
|
276
|
-
def on_radio_cw_init( channel_num, data )
|
277
|
-
self.log_response_event( channel_num, data, "radio_cw_init", "Channel assigned." )
|
278
|
-
end
|
279
|
-
|
280
|
-
|
281
|
-
### Handle capabilities response event.
|
282
|
-
def on_capabilities( channel_num, data )
|
283
|
-
self.log_response_event( channel_num, data, "capabilities", "Channel assigned." )
|
284
|
-
end
|
285
|
-
|
286
|
-
|
287
|
-
### Handle stacklimit response event.
|
288
|
-
def on_stacklimit( channel_num, data )
|
289
|
-
self.log_response_event( channel_num, data, "stacklimit", "Channel assigned." )
|
290
|
-
end
|
291
|
-
|
292
|
-
|
293
|
-
### Handle script_data response event.
|
294
|
-
def on_script_data( channel_num, data )
|
295
|
-
self.log_response_event( channel_num, data, "script_data", "Channel assigned." )
|
296
|
-
end
|
297
|
-
|
298
|
-
|
299
|
-
### Handle script_cmd response event.
|
300
|
-
def on_script_cmd( channel_num, data )
|
301
|
-
self.log_response_event( channel_num, data, "script_cmd", "Channel assigned." )
|
302
|
-
end
|
303
|
-
|
304
|
-
|
305
|
-
### Handle id_list_add response event.
|
306
|
-
def on_id_list_add( channel_num, data )
|
307
|
-
self.log_response_event( channel_num, data, "id_list_add", "Channel assigned." )
|
308
|
-
end
|
309
|
-
|
310
|
-
|
311
|
-
### Handle crypto_id_list_add response event.
|
312
|
-
def on_crypto_id_list_add( channel_num, data )
|
313
|
-
self.log_response_event( channel_num, data, "crypto_id_list_add", "Channel assigned." )
|
314
|
-
end
|
315
|
-
|
316
|
-
|
317
|
-
### Handle id_list_config response event.
|
318
|
-
def on_id_list_config( channel_num, data )
|
319
|
-
self.log_response_event( channel_num, data, "id_list_config", "Channel assigned." )
|
320
|
-
end
|
321
|
-
|
322
|
-
|
323
|
-
### Handle crypto_id_list_config response event.
|
324
|
-
def on_crypto_id_list_config( channel_num, data )
|
325
|
-
self.log_response_event( channel_num, data, "crypto_id_list_config", "Channel assigned." )
|
326
|
-
end
|
327
|
-
|
328
|
-
|
329
|
-
### Handle open_rx_scan response event.
|
330
|
-
def on_open_rx_scan( channel_num, data )
|
331
|
-
self.log_response_event( channel_num, data, "open_rx_scan", "Channel assigned." )
|
332
|
-
end
|
333
|
-
|
334
|
-
|
335
|
-
### Handle ext_channel_radio_freq_id response event.
|
336
|
-
def on_ext_channel_radio_freq_id( channel_num, data )
|
337
|
-
self.log_response_event( channel_num, data, "ext_channel_radio_freq_id", "Channel assigned." )
|
338
|
-
end
|
339
|
-
|
340
|
-
|
341
|
-
### Handle ext_broadcast_data response event.
|
342
|
-
def on_ext_broadcast_data( channel_num, data )
|
343
|
-
self.log_response_event( channel_num, data, "ext_broadcast_data", "Channel assigned." )
|
344
|
-
end
|
345
|
-
|
346
|
-
|
347
|
-
### Handle ext_acknowledged_data response event.
|
348
|
-
def on_ext_acknowledged_data( channel_num, data )
|
349
|
-
self.log_response_event( channel_num, data, "ext_acknowledged_data", "Channel assigned." )
|
350
|
-
end
|
351
|
-
|
352
|
-
|
353
|
-
### Handle ext_burst_data response event.
|
354
|
-
def on_ext_burst_data( channel_num, data )
|
355
|
-
self.log_response_event( channel_num, data, "ext_burst_data", "Channel assigned." )
|
223
|
+
self.log_response_event( channel_num, data, "requesting channel status", "Got channel status." )
|
356
224
|
end
|
357
225
|
|
358
226
|
|
359
|
-
### Handle
|
360
|
-
def on_channel_radio_tx_power( channel_num, data )
|
361
|
-
self.log_response_event( channel_num, data, "channel_radio_tx_power", "Channel assigned." )
|
362
|
-
end
|
363
|
-
|
364
|
-
|
365
|
-
### Handle get_serial_num response event.
|
366
|
-
def on_get_serial_num( channel_num, data )
|
367
|
-
self.log_response_event( channel_num, data, "get_serial_num", "Channel assigned." )
|
368
|
-
end
|
369
|
-
|
370
|
-
|
371
|
-
### Handle get_temp_cal response event.
|
372
|
-
def on_get_temp_cal( channel_num, data )
|
373
|
-
self.log_response_event( channel_num, data, "get_temp_cal", "Channel assigned." )
|
374
|
-
end
|
375
|
-
|
376
|
-
|
377
|
-
### Handle set_lp_search_timeout response event.
|
378
|
-
def on_set_lp_search_timeout( channel_num, data )
|
379
|
-
self.log_response_event( channel_num, data, "set_lp_search_timeout", "Channel assigned." )
|
380
|
-
end
|
381
|
-
|
382
|
-
|
383
|
-
### Handle set_tx_search_on_next response event.
|
384
|
-
def on_set_tx_search_on_next( channel_num, data )
|
385
|
-
self.log_response_event( channel_num, data, "set_tx_search_on_next", "Channel assigned." )
|
386
|
-
end
|
387
|
-
|
388
|
-
|
389
|
-
### Handle serial_num_set_channel_id response event.
|
390
|
-
def on_serial_num_set_channel_id( channel_num, data )
|
391
|
-
self.log_response_event( channel_num, data, "serial_num_set_channel_id", "Channel assigned." )
|
392
|
-
end
|
393
|
-
|
394
|
-
|
395
|
-
### Handle rx_ext_mesgs_enable response event.
|
227
|
+
### Handle on_rx_ext_mesgs_enable response event.
|
396
228
|
def on_rx_ext_mesgs_enable( channel_num, data )
|
397
|
-
self.log_response_event( channel_num, data, "
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
### Handle radio_config_always response event.
|
402
|
-
def on_radio_config_always( channel_num, data )
|
403
|
-
self.log_response_event( channel_num, data, "radio_config_always", "Channel assigned." )
|
229
|
+
self.log_response_event( channel_num, data, "enabling extended message: not supported",
|
230
|
+
"Enabled extended messages." )
|
404
231
|
end
|
405
232
|
|
406
233
|
|
407
|
-
### Handle
|
408
|
-
def on_enable_led_flash( channel_num, data )
|
409
|
-
self.log_response_event( channel_num, data, "enable_led_flash", "Channel assigned." )
|
410
|
-
end
|
411
|
-
|
412
|
-
|
413
|
-
### Handle xtal_enable response event.
|
414
|
-
def on_xtal_enable( channel_num, data )
|
415
|
-
self.log_response_event( channel_num, data, "xtal_enable", "Channel assigned." )
|
416
|
-
end
|
417
|
-
|
418
|
-
|
419
|
-
### Handle antlib_config response event.
|
420
|
-
def on_antlib_config( channel_num, data )
|
421
|
-
self.log_response_event( channel_num, data, "antlib_config", "Channel assigned." )
|
422
|
-
end
|
423
|
-
|
424
|
-
|
425
|
-
### Handle auto_freq_config response event.
|
234
|
+
### Handle on_rx_ext_mesgs_enable response event.
|
426
235
|
def on_auto_freq_config( channel_num, data )
|
427
|
-
self.log_response_event( channel_num, data, "
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
### Handle prox_search_config response event.
|
432
|
-
def on_prox_search_config( channel_num, data )
|
433
|
-
self.log_response_event( channel_num, data, "prox_search_config", "Channel assigned." )
|
236
|
+
self.log_response_event( channel_num, data, "enabling frequency agility",
|
237
|
+
"Enabled frequency agility." )
|
434
238
|
end
|
435
239
|
|
436
240
|
|
437
|
-
### Handle
|
438
|
-
def
|
439
|
-
self.
|
440
|
-
end
|
241
|
+
### Handle callback when requesting advanced burst configuration.
|
242
|
+
def on_config_adv_burst_id( type, data )
|
243
|
+
self.log.debug "Advanced burst config/capabilities: 0x%02x: %p" % [ type, data ]
|
441
244
|
|
245
|
+
# Advanced burst capabilities
|
246
|
+
if type == 0
|
247
|
+
max_packet_length, features = data.unpack( 'CV' )
|
248
|
+
features = Ant::BitVector.new( features )
|
442
249
|
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
250
|
+
caps = {
|
251
|
+
max_packet_length: max_packet_length,
|
252
|
+
frequency_hopping: features.on?( Ant::ADV_BURST_CONFIG_FREQ_HOP )
|
253
|
+
}
|
447
254
|
|
255
|
+
self.log.info "Advanced burst capabilities: %p" % [ caps ]
|
256
|
+
Ant.instance_variable_set( :@advanced_burst_capabilities, caps );
|
448
257
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
258
|
+
# Advanced burst current configuration
|
259
|
+
elsif type == 1
|
260
|
+
enabled, max_packet_length, required, optional, stall_count, retry_count =
|
261
|
+
data.unpack( 'CCVVvC' )
|
262
|
+
required = Ant::BitVector.new( required )
|
263
|
+
optional = Ant::BitVector.new( optional )
|
453
264
|
|
265
|
+
required_features = []
|
266
|
+
required_features << :frequency_hopping if required.on?( Ant::ADV_BURST_CONFIG_FREQ_HOP )
|
454
267
|
|
455
|
-
|
456
|
-
|
457
|
-
self.log_response_event( channel_num, data, "high_duty_search_mode", "Channel assigned." )
|
458
|
-
end
|
268
|
+
optional_features = []
|
269
|
+
optional_features << :frequency_hopping if optional.on?( Ant::ADV_BURST_CONFIG_FREQ_HOP )
|
459
270
|
|
271
|
+
config = {
|
272
|
+
enabled: enabled == 1,
|
273
|
+
max_packet_length: max_packet_length,
|
274
|
+
required_features: required_features,
|
275
|
+
optional_features: optional_features,
|
276
|
+
stall_count: stall_count,
|
277
|
+
retry_count_extension: retry_count
|
278
|
+
}
|
460
279
|
|
461
|
-
|
462
|
-
|
463
|
-
self.log_response_event( channel_num, data, "config_adv_burst", "Channel assigned." )
|
464
|
-
end
|
280
|
+
self.log.info "Advanced burst configuration: %p" % [ config ]
|
281
|
+
Ant.instance_variable_set( :@advanced_burst_config, config );
|
465
282
|
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
self.log_response_event( channel_num, data, "event_filter_config", "Channel assigned." )
|
470
|
-
end
|
471
|
-
|
472
|
-
|
473
|
-
### Handle sdu_config response event.
|
474
|
-
def on_sdu_config( channel_num, data )
|
475
|
-
self.log_response_event( channel_num, data, "sdu_config", "Channel assigned." )
|
476
|
-
end
|
477
|
-
|
478
|
-
|
479
|
-
### Handle sdu_set_mask response event.
|
480
|
-
def on_sdu_set_mask( channel_num, data )
|
481
|
-
self.log_response_event( channel_num, data, "sdu_set_mask", "Channel assigned." )
|
482
|
-
end
|
483
|
-
|
484
|
-
|
485
|
-
### Handle user_config_page response event.
|
486
|
-
def on_user_config_page( channel_num, data )
|
487
|
-
self.log_response_event( channel_num, data, "user_config_page", "Channel assigned." )
|
488
|
-
end
|
489
|
-
|
490
|
-
|
491
|
-
### Handle encrypt_enable response event.
|
492
|
-
def on_encrypt_enable( channel_num, data )
|
493
|
-
self.log_response_event( channel_num, data, "encrypt_enable", "Channel assigned." )
|
283
|
+
else
|
284
|
+
self.log.warn "Unknown advanced burst response type %p." % [ type ]
|
285
|
+
end
|
494
286
|
end
|
495
287
|
|
496
288
|
|
497
|
-
### Handle
|
498
|
-
def
|
499
|
-
|
500
|
-
|
501
|
-
|
289
|
+
### Handle capabilities response event.
|
290
|
+
def on_capabilities( channel_num, data )
|
291
|
+
std_opts = Ant::BitVector.new( data.bytes[2] )
|
292
|
+
adv_opts = Ant::BitVector.new( data.bytes[3] )
|
293
|
+
adv_opts2 = Ant::BitVector.new( data.bytes[4] )
|
294
|
+
adv_opts3 = Ant::BitVector.new( data.bytes[6] )
|
295
|
+
adv_opts4 = Ant::BitVector.new( data.bytes[7] )
|
296
|
+
|
297
|
+
caps = {
|
298
|
+
max_channels: data.bytes[0],
|
299
|
+
max_networks: data.bytes[1],
|
300
|
+
max_sensrcore_channels: data.bytes[5],
|
301
|
+
|
302
|
+
rx_channels_enabled: std_opts.off?( Ant::CAPABILITIES_NO_RX_CHANNELS ),
|
303
|
+
tx_channels_enabled: std_opts.off?( Ant::CAPABILITIES_NO_TX_CHANNELS ),
|
304
|
+
rx_messages_enabled: std_opts.off?( Ant::CAPABILITIES_NO_RX_MESSAGES ),
|
305
|
+
tx_messages_enabled: std_opts.off?( Ant::CAPABILITIES_NO_TX_MESSAGES ),
|
306
|
+
ackd_messages_enabled: std_opts.off?( Ant::CAPABILITIES_NO_ACKD_MESSAGES ),
|
307
|
+
burst_transfer_enabled: std_opts.off?( Ant::CAPABILITIES_NO_BURST_TRANSFER ),
|
308
|
+
|
309
|
+
overun_underrun: adv_opts.on?( Ant::CAPABILITIES_OVERUN_UNDERRUN ),
|
310
|
+
network_enabled: adv_opts.on?( Ant::CAPABILITIES_NETWORK_ENABLED ),
|
311
|
+
api_version2: adv_opts.on?( Ant::CAPABILITIES_AP1_VERSION_2 ),
|
312
|
+
serial_number_enabled: adv_opts.on?( Ant::CAPABILITIES_SERIAL_NUMBER_ENABLED ),
|
313
|
+
per_channel_tx_power_enabled: adv_opts.on?( Ant::CAPABILITIES_PER_CHANNEL_TX_POWER_ENABLED ),
|
314
|
+
low_priority_search_enabled: adv_opts.on?( Ant::CAPABILITIES_LOW_PRIORITY_SEARCH_ENABLED ),
|
315
|
+
script_enabled: adv_opts.on?( Ant::CAPABILITIES_SCRIPT_ENABLED ),
|
316
|
+
search_list_enabled: adv_opts.on?( Ant::CAPABILITIES_SEARCH_LIST_ENABLED ),
|
317
|
+
|
318
|
+
led_enabled: adv_opts2.on?( Ant::CAPABILITIES_LED_ENABLED ),
|
319
|
+
ext_message_enabled: adv_opts2.on?( Ant::CAPABILITIES_EXT_MESSAGE_ENABLED ),
|
320
|
+
scan_mode_enabled: adv_opts2.on?( Ant::CAPABILITIES_SCAN_MODE_ENABLED ),
|
321
|
+
prox_search_enabled: adv_opts2.on?( Ant::CAPABILITIES_PROX_SEARCH_ENABLED ),
|
322
|
+
ext_assign_enabled: adv_opts2.on?( Ant::CAPABILITIES_EXT_ASSIGN_ENABLED ),
|
323
|
+
antfs_enabled: adv_opts2.on?( Ant::CAPABILITIES_FS_ANTFS_ENABLED ),
|
324
|
+
fit1_enabled: adv_opts2.on?( Ant::CAPABILITIES_FIT1_ENABLED ),
|
325
|
+
|
326
|
+
advanced_burst_enabled: adv_opts3.on?( Ant::CAPABILITIES_ADVANCED_BURST_ENABLED ),
|
327
|
+
event_buffering_enabled: adv_opts3.on?( Ant::CAPABILITIES_EVENT_BUFFERING_ENABLED ),
|
328
|
+
event_filtering_enabled: adv_opts3.on?( Ant::CAPABILITIES_EVENT_FILTERING_ENABLED ),
|
329
|
+
high_duty_search_mode_enabled: adv_opts3.on?( Ant::CAPABILITIES_HIGH_DUTY_SEARCH_MODE_ENABLED ),
|
330
|
+
active_search_sharing_mode_enabled: adv_opts3.on?( Ant::CAPABILITIES_ACTIVE_SEARCH_SHARING_MODE_ENABLED ),
|
331
|
+
selective_data_update_enabled: adv_opts3.on?( Ant::CAPABILITIES_SELECTIVE_DATA_UPDATE_ENABLED ),
|
332
|
+
encrypted_channel_enabled: adv_opts3.on?( Ant::CAPABILITIES_ENCRYPTED_CHANNEL_ENABLED ),
|
333
|
+
|
334
|
+
rfactive_notification_enabled: adv_opts4.on?( Ant::CAPABILITIES_RFACTIVE_NOTIFICATION_ENABLED ),
|
335
|
+
}.freeze
|
336
|
+
|
337
|
+
caplist = caps.keys.select do |cap|
|
338
|
+
caps[ cap ]
|
339
|
+
end
|
340
|
+
self.log.info "ANT Capabilities: %s" % [ caplist.sort.join(' ') ]
|
502
341
|
|
503
|
-
|
504
|
-
def on_set_crypto_info( channel_num, data )
|
505
|
-
self.log_response_event( channel_num, data, "set_crypto_info", "Channel assigned." )
|
342
|
+
Ant.instance_variable_set( :@capabilities, caps );
|
506
343
|
end
|
507
344
|
|
508
345
|
|
509
|
-
### Handle
|
510
|
-
def
|
511
|
-
|
512
|
-
end
|
513
|
-
|
346
|
+
### Handle serial number response event.
|
347
|
+
def on_get_serial_num( channel_num, data )
|
348
|
+
serial = data.unpack1( 'L<' )
|
514
349
|
|
515
|
-
|
516
|
-
|
517
|
-
self.log_response_event( channel_num, data, "active_search_sharing", "Channel assigned." )
|
350
|
+
self.log.debug "ANT device serial number: %d." % [ serial ]
|
351
|
+
Ant.instance_variable_set( :@serial_num, serial )
|
518
352
|
end
|
519
353
|
|
520
354
|
|
521
|
-
### Handle
|
522
|
-
def
|
523
|
-
self.log_response_event( channel_num, data, "
|
355
|
+
### Handle request response event.
|
356
|
+
def on_request( channel_num, data )
|
357
|
+
self.log_response_event( channel_num, data, "requesting an unsupported message", "[n/a]" )
|
524
358
|
end
|
525
359
|
|
526
|
-
|
527
360
|
end # module Ant::ResponseCallbacks
|
528
361
|
|