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.
@@ -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::MESG_UNASSIGN_CHANNEL_ID => :on_unassign_channel,
32
+ Ant::Message::MESG_NETWORK_KEY_ID => :on_network_key,
23
33
  Ant::Message::MESG_ASSIGN_CHANNEL_ID => :on_assign_channel,
24
- Ant::Message::MESG_CHANNEL_MESG_PERIOD_ID => :on_channel_mesg_period,
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::MESG_CHANNEL_ID_ID => :on_channel_id,
40
- Ant::Message::MESG_CHANNEL_STATUS_ID => :on_channel_status,
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::MESG_EXT_CHANNEL_RADIO_FREQ_ID => :on_ext_channel_radio_freq_id,
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::MESG_PROX_SEARCH_CONFIG_ID => :on_prox_search_config,
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
- Ant::Message::MESG_SET_SEARCH_CH_PRIORITY_ID => :on_set_search_ch_priority,
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.public_send( handler_method, channel_num, data )
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
- self.log.info "ANT Version %s" % [ data ]
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", "Channel assigned." )
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", "Channel unassigned." )
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, "channel_mesg_period", "Channel period assigned." )
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, "channel_search_timeout", "Channel assigned." )
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, "radio_tx_power", "Channel assigned." )
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, "broadcast_data", "Channel assigned." )
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, "acknowledged_data", "Channel assigned." )
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, "burst_data", "Channel assigned." )
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, "channel_status", "Channel assigned." )
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 channel_radio_tx_power response event.
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, "rx_ext_mesgs_enable", "Channel assigned." )
398
- end
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 enable_led_flash response event.
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, "auto_freq_config", "Channel assigned." )
428
- end
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 adv_burst_data response event.
438
- def on_adv_burst_data( channel_num, data )
439
- self.log_response_event( channel_num, data, "adv_burst_data", "Channel assigned." )
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
- ### Handle event_buffering_config response event.
444
- def on_event_buffering_config( channel_num, data )
445
- self.log_response_event( channel_num, data, "event_buffering_config", "Channel assigned." )
446
- end
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
- ### Handle set_search_ch_priority response event.
450
- def on_set_search_ch_priority( channel_num, data )
451
- self.log_response_event( channel_num, data, "set_search_ch_priority", "Channel assigned." )
452
- end
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
- ### Handle high_duty_search_mode response event.
456
- def on_high_duty_search_mode( channel_num, data )
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
- ### Handle config_adv_burst response event.
462
- def on_config_adv_burst( channel_num, data )
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
- ### Handle event_filter_config response event.
468
- def on_event_filter_config( channel_num, data )
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 set_crypto_key response event.
498
- def on_set_crypto_key( channel_num, data )
499
- self.log_response_event( channel_num, data, "set_crypto_key", "Channel assigned." )
500
- end
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
- ### Handle set_crypto_info response event.
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 cube_cmd response event.
510
- def on_cube_cmd( channel_num, data )
511
- self.log_response_event( channel_num, data, "cube_cmd", "Channel assigned." )
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
- ### Handle active_search_sharing response event.
516
- def on_active_search_sharing( channel_num, data )
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 nvm_crypto_key_ops response event.
522
- def on_nvm_crypto_key_ops( channel_num, data )
523
- self.log_response_event( channel_num, data, "nvm_crypto_key_ops", "Channel assigned." )
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