ant-wireless 0.1.0.pre.20210617213631 → 0.2.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,6 +4,7 @@
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.
@@ -16,91 +17,50 @@ module Ant::ResponseCallbacks
16
17
 
17
18
  # Mapping of response message IDs to handler methods
18
19
  HANDLER_METHODS = {
20
+ Ant::Message::MESG_STARTUP_MESG_ID => :on_startup_mesg,
21
+
22
+ Ant::Message::MESG_CAPABILITIES_ID => :on_capabilities,
23
+ Ant::Message::MESG_CHANNEL_STATUS_ID => :on_channel_status,
19
24
  Ant::Message::MESG_VERSION_ID => :on_version,
25
+ Ant::Message::MESG_CHANNEL_ID_ID => :on_channel_id,
26
+ Ant::Message::MESG_EVENT_BUFFERING_CONFIG_ID => :on_event_buffering_config,
27
+ Ant::Message::MESG_GET_SERIAL_NUM_ID => :on_get_serial_num,
28
+
20
29
  Ant::Message::MESG_RESPONSE_EVENT_ID => :on_response_event,
21
30
 
22
- Ant::Message::MESG_UNASSIGN_CHANNEL_ID => :on_unassign_channel,
31
+ Ant::Message::MESG_NETWORK_KEY_ID => :on_network_key,
23
32
  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,
33
+ Ant::Message::MESG_UNASSIGN_CHANNEL_ID => :on_unassign_channel,
26
34
  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
35
  Ant::Message::MESG_OPEN_CHANNEL_ID => :on_open_channel,
36
+
37
+ Ant::Message::MESG_RX_EXT_MESGS_ENABLE_ID => :on_rx_ext_mesgs_enable,
32
38
  Ant::Message::MESG_CLOSE_CHANNEL_ID => :on_close_channel,
33
39
  Ant::Message::MESG_REQUEST_ID => :on_request,
34
40
 
35
41
  Ant::Message::MESG_BROADCAST_DATA_ID => :on_broadcast_data,
36
42
  Ant::Message::MESG_ACKNOWLEDGED_DATA_ID => :on_acknowledged_data,
37
43
  Ant::Message::MESG_BURST_DATA_ID => :on_burst_data,
44
+ Ant::Message::MESG_ADV_BURST_DATA_ID => :on_adv_burst_data,
38
45
 
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,
54
-
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,
59
-
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
- Ant::Message::MESG_AUTO_FREQ_CONFIG_ID => :on_auto_freq_config,
73
- Ant::Message::MESG_PROX_SEARCH_CONFIG_ID => :on_prox_search_config,
46
+ Ant::Message::MESG_CHANNEL_MESG_PERIOD_ID => :on_channel_mesg_period,
47
+ Ant::Message::MESG_CHANNEL_SEARCH_TIMEOUT_ID => :on_channel_search_timeout,
74
48
 
75
- Ant::Message::MESG_ADV_BURST_DATA_ID => :on_adv_burst_data,
76
- Ant::Message::MESG_EVENT_BUFFERING_CONFIG_ID => :on_event_buffering_config,
49
+ Ant::Message::MESG_RADIO_TX_POWER_ID => :on_radio_tx_power,
77
50
 
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,
51
+ # :TODO: There are many other MESG_ constants, but I think most or all of
52
+ # them are for the serial protocol.
93
53
  }
94
54
 
95
55
 
96
56
 
97
57
  ### Default callback hook -- handles response callbacks.
98
- def handle_response_callback( channel_num, message_id, data )
99
- handler_method = HANDLER_METHODS[ message_id ] or
58
+ def self::handle_response_callback( channel_num, message_id, data )
59
+ handler_method = Ant::ResponseCallbacks::HANDLER_METHODS[ message_id ] or
100
60
  raise "Unhandled response message ID %p" % [ message_id ]
101
61
 
102
- if self.respond_to?( handler_method )
103
- self.public_send( handler_method, channel_num, data )
62
+ if self.respond_to?( handler_method, true )
63
+ self.send( handler_method, channel_num, data )
104
64
  else
105
65
  Ant::ResponseCallbacks.log_response_callback( channel_num, handler_method, message_id, data )
106
66
  end
@@ -118,13 +78,15 @@ module Ant::ResponseCallbacks
118
78
  end
119
79
 
120
80
 
121
- #
122
- # Handlers
123
- #
81
+ ###############
82
+ module_function
83
+ ###############
124
84
 
125
85
  ### Handle version number response messages.
126
86
  def on_version( channel_num, data )
127
- self.log.info "ANT Version %s" % [ data ]
87
+ version = data.strip
88
+ self.log.info "ANT Version %s" % [ version ]
89
+ Ant.instance_variable_set( :@hardware_version, version )
128
90
  end
129
91
 
130
92
 
@@ -135,6 +97,19 @@ module Ant::ResponseCallbacks
135
97
  end
136
98
 
137
99
 
100
+ ### Log a success or an error message for a response event message.
101
+ def log_response_event( channel_num, data, err_desc, log_desc )
102
+ status = data.bytes[ 2 ]
103
+ channel = Ant::Channel.registry[ channel_num ]
104
+
105
+ if status.nonzero?
106
+ self.log.error "Error while %s on %p: %#02x" % [ err_desc, channel, status ]
107
+ else
108
+ self.log.info( log_desc )
109
+ end
110
+ end
111
+
112
+
138
113
  ### Handle startup response messages.
139
114
  def on_startup_mesg( channel_num, data )
140
115
  reason = case data.bytes[ 0 ]
@@ -166,13 +141,15 @@ module Ant::ResponseCallbacks
166
141
 
167
142
  ### Handle channel assignment event response messages.
168
143
  def on_assign_channel( channel_num, data )
169
- self.log_response_event( channel_num, data, "assigning channel", "Channel assigned." )
144
+ self.log_response_event( channel_num, data, "assigning channel",
145
+ "Channel %d assigned." % [channel_num] )
170
146
  end
171
147
 
172
148
 
173
149
  ### Handle channel unassignment event response messages.
174
- def on_unassign_channel
175
- self.log_response_event( channel_num, data, "unassigning channel", "Channel unassigned." )
150
+ def on_unassign_channel( channel_num, data )
151
+ self.log_response_event( channel_num, data, "unassigning channel",
152
+ "Channel %d unassigned." % [channel_num] )
176
153
  end
177
154
 
178
155
 
@@ -201,328 +178,125 @@ module Ant::ResponseCallbacks
201
178
  end
202
179
 
203
180
 
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
181
  ### Handle channel_mesg_period response events.
216
182
  def on_channel_mesg_period( channel_num, data )
217
- self.log_response_event( channel_num, data, "channel_mesg_period", "Channel period assigned." )
183
+ self.log_response_event( channel_num, data, "setting channel period", "Channel period assigned." )
218
184
  end
219
185
 
220
186
 
221
187
  ### Handle channel_search_timeout response event.
222
188
  def on_channel_search_timeout( channel_num, data )
223
- self.log_response_event( channel_num, data, "channel_search_timeout", "Channel assigned." )
189
+ self.log_response_event( channel_num, data, "setting search timeout", "Search timeout." )
224
190
  end
225
191
 
226
192
 
227
193
  ### Handle radio_tx_power response event.
228
194
  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." )
195
+ self.log_response_event( channel_num, data, "setting transmit power", "Transmit power changed." )
248
196
  end
249
197
 
250
198
 
251
199
  ### Handle broadcast_data response event.
252
200
  def on_broadcast_data( channel_num, data )
253
- self.log_response_event( channel_num, data, "broadcast_data", "Channel assigned." )
201
+ self.log_response_event( channel_num, data, "sending broadcast data", "Sent broadcast data." )
254
202
  end
255
203
 
256
204
 
257
205
  ### Handle acknowledged_data response event.
258
206
  def on_acknowledged_data( channel_num, data )
259
- self.log_response_event( channel_num, data, "acknowledged_data", "Channel assigned." )
207
+ self.log_response_event( channel_num, data, "sending acked data", "Acked data sent." )
260
208
  end
261
209
 
262
210
 
263
211
  ### Handle burst_data response event.
264
212
  def on_burst_data( channel_num, data )
265
- self.log_response_event( channel_num, data, "burst_data", "Channel assigned." )
213
+ self.log_response_event( channel_num, data, "sending burst data", "Burst data sent." )
266
214
  end
267
215
 
268
216
 
269
217
  ### Handle channel_status response event.
270
218
  def on_channel_status( channel_num, data )
271
- self.log_response_event( channel_num, data, "channel_status", "Channel assigned." )
219
+ self.log_response_event( channel_num, data, "requesting channel status", "Got channel status." )
272
220
  end
273
221
 
274
222
 
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." )
223
+ ### Handle on_rx_ext_mesgs_enable response event.
224
+ def on_rx_ext_mesgs_enable( channel_num, data )
225
+ self.log_response_event( channel_num, data, "enabling extended message: not supported",
226
+ "Enabled extended messages." )
278
227
  end
279
228
 
280
229
 
281
230
  ### Handle capabilities response event.
282
231
  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." )
356
- end
357
-
232
+ std_opts = Ant::BitVector.new( data.bytes[2] )
233
+ adv_opts = Ant::BitVector.new( data.bytes[3] )
234
+ adv_opts2 = Ant::BitVector.new( data.bytes[4] )
235
+ adv_opts3 = Ant::BitVector.new( data.bytes[6] )
236
+ adv_opts4 = Ant::BitVector.new( data.bytes[7] )
237
+
238
+ caps = {
239
+ max_channels: data.bytes[0],
240
+ max_networks: data.bytes[1],
241
+ max_sensrcore_channels: data.bytes[5],
242
+
243
+ rx_channels_enabled: std_opts.off?( Ant::CAPABILITIES_NO_RX_CHANNELS ),
244
+ tx_channels_enabled: std_opts.off?( Ant::CAPABILITIES_NO_TX_CHANNELS ),
245
+ rx_messages_enabled: std_opts.off?( Ant::CAPABILITIES_NO_RX_MESSAGES ),
246
+ tx_messages_enabled: std_opts.off?( Ant::CAPABILITIES_NO_TX_MESSAGES ),
247
+ ackd_messages_enabled: std_opts.off?( Ant::CAPABILITIES_NO_ACKD_MESSAGES ),
248
+ burst_transfer_enabled: std_opts.off?( Ant::CAPABILITIES_NO_BURST_TRANSFER ),
249
+
250
+ overun_underrun: adv_opts.on?( Ant::CAPABILITIES_OVERUN_UNDERRUN ),
251
+ network_enabled: adv_opts.on?( Ant::CAPABILITIES_NETWORK_ENABLED ),
252
+ api_version2: adv_opts.on?( Ant::CAPABILITIES_AP1_VERSION_2 ),
253
+ serial_number_enabled: adv_opts.on?( Ant::CAPABILITIES_SERIAL_NUMBER_ENABLED ),
254
+ per_channel_tx_power_enabled: adv_opts.on?( Ant::CAPABILITIES_PER_CHANNEL_TX_POWER_ENABLED ),
255
+ low_priority_search_enabled: adv_opts.on?( Ant::CAPABILITIES_LOW_PRIORITY_SEARCH_ENABLED ),
256
+ script_enabled: adv_opts.on?( Ant::CAPABILITIES_SCRIPT_ENABLED ),
257
+ search_list_enabled: adv_opts.on?( Ant::CAPABILITIES_SEARCH_LIST_ENABLED ),
258
+
259
+ led_enabled: adv_opts2.on?( Ant::CAPABILITIES_LED_ENABLED ),
260
+ ext_message_enabled: adv_opts2.on?( Ant::CAPABILITIES_EXT_MESSAGE_ENABLED ),
261
+ scan_mode_enabled: adv_opts2.on?( Ant::CAPABILITIES_SCAN_MODE_ENABLED ),
262
+ prox_search_enabled: adv_opts2.on?( Ant::CAPABILITIES_PROX_SEARCH_ENABLED ),
263
+ ext_assign_enabled: adv_opts2.on?( Ant::CAPABILITIES_EXT_ASSIGN_ENABLED ),
264
+ antfs_enabled: adv_opts2.on?( Ant::CAPABILITIES_FS_ANTFS_ENABLED ),
265
+ fit1_enabled: adv_opts2.on?( Ant::CAPABILITIES_FIT1_ENABLED ),
266
+
267
+ advanced_burst_enabled: adv_opts3.on?( Ant::CAPABILITIES_ADVANCED_BURST_ENABLED ),
268
+ event_buffering_enabled: adv_opts3.on?( Ant::CAPABILITIES_EVENT_BUFFERING_ENABLED ),
269
+ event_filtering_enabled: adv_opts3.on?( Ant::CAPABILITIES_EVENT_FILTERING_ENABLED ),
270
+ high_duty_search_mode_enabled: adv_opts3.on?( Ant::CAPABILITIES_HIGH_DUTY_SEARCH_MODE_ENABLED ),
271
+ active_search_sharing_mode_enabled: adv_opts3.on?( Ant::CAPABILITIES_ACTIVE_SEARCH_SHARING_MODE_ENABLED ),
272
+ selective_data_update_enabled: adv_opts3.on?( Ant::CAPABILITIES_SELECTIVE_DATA_UPDATE_ENABLED ),
273
+ encrypted_channel_enabled: adv_opts3.on?( Ant::CAPABILITIES_ENCRYPTED_CHANNEL_ENABLED ),
274
+
275
+ rfactive_notification_enabled: adv_opts4.on?( Ant::CAPABILITIES_RFACTIVE_NOTIFICATION_ENABLED ),
276
+ }.freeze
277
+
278
+ caplist = caps.keys.select do |cap|
279
+ caps[ cap ]
280
+ end
281
+ self.log.info "ANT Capabilities: %s" % [ caplist.sort.join(' ') ]
358
282
 
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." )
283
+ Ant.instance_variable_set( :@capabilities, caps );
362
284
  end
363
285
 
364
286
 
365
- ### Handle get_serial_num response event.
287
+ ### Handle serial number response event.
366
288
  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.
396
- 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." )
404
- end
405
-
406
-
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.
426
- def on_auto_freq_config( channel_num, data )
427
- self.log_response_event( channel_num, data, "auto_freq_config", "Channel assigned." )
428
- end
289
+ serial = data.unpack1( 'L<' )
429
290
 
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." )
434
- end
435
-
436
-
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
441
-
442
-
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
447
-
448
-
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
453
-
454
-
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
459
-
460
-
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
465
-
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." )
494
- end
495
-
496
-
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." )
291
+ self.log.debug "ANT device serial number: %d." % [ serial ]
292
+ Ant.instance_variable_set( :@serial_num, serial )
500
293
  end
501
294
 
502
295
 
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." )
506
- end
507
-
508
-
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
-
514
-
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." )
518
- end
519
-
520
-
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." )
296
+ ### Handle request response event.
297
+ def on_request( channel_num, data )
298
+ self.log_response_event( channel_num, data, "requesting an unsupported message", "[n/a]" )
524
299
  end
525
300
 
526
-
527
301
  end # module Ant::ResponseCallbacks
528
302
 
data/lib/ant/wireless.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # -*- ruby -*-
2
2
  # frozen_string_literal: true
3
3
 
4
+ # Namespace placeholder so you can `require 'ant/wireless'`
5
+
4
6
  require 'ant'
5
7
 
@@ -0,0 +1,7 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ # Namespace placeholder so you can `require 'ant-wireless'`
5
+
6
+ require 'ant'
7
+
data/lib/ant.rb CHANGED
@@ -12,11 +12,7 @@ module Ant
12
12
  extend Loggability
13
13
 
14
14
  # Package version
15
- VERSION = '0.0.1'
16
-
17
- # Version control revision
18
- REVISION = %q$Revision$
19
-
15
+ VERSION = '0.2.0'
20
16
 
21
17
  # A Range for matching valid ANT device numbers
22
18
  VALID_DEVICE_NUMBERS = ( 0...65535 ).freeze
@@ -35,18 +31,31 @@ module Ant
35
31
  log_as :ant
36
32
 
37
33
 
38
- Loggability.level = :debug
39
-
40
-
41
34
  autoload :ResponseCallbacks, 'ant/response_callbacks'
42
35
  autoload :DataUtilities, 'ant/mixins'
43
36
 
44
37
 
45
- ### Set up the given +mod+ as the handler module for response callbacks. You can
46
- ### create your own handler module and extend with the default Ant::ResponseCallbacks.
47
- def self::set_response_handlers( mod=Ant::ResponseCallbacks )
48
- self.extend( mod )
49
- self.on_response( &self.method(:handle_response_callback) )
38
+ # Capabilities hash -- set asynchronously by calling Ant.request_capabilities
39
+ @capabilities = nil
40
+ singleton_class.attr_reader( :capabilities )
41
+
42
+ # Serial number -- set asynchronously by calling Ant.request_serial_num
43
+ @serial_num = nil
44
+ singleton_class.attr_reader( :serial_num )
45
+
46
+ # Version of ANT supported by the hardware -- set asynchronously by calling
47
+ # Ant.request_version
48
+ @hardware_version = nil
49
+ singleton_class.attr_reader( :hardware_version )
50
+
51
+ # Add some convenience aliases
52
+ singleton_class.alias_method( :is_initialized?, :initialized? )
53
+
54
+
55
+ ### Set up the given +object+ as the handler for response callbacks. It must
56
+ ### respond to :handle_response_callback.
57
+ def self::set_response_handler( object=Ant::ResponseCallbacks )
58
+ self.on_response( &object.method(:handle_response_callback) )
50
59
  end
51
60
 
52
61
 
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 {
data/spec/spec_helper.rb CHANGED
@@ -20,6 +20,8 @@ RSpec.configure do |config|
20
20
  Ant.init
21
21
  Ant.close
22
22
  rescue => err
23
+ $stderr.puts "%p while initializing hardware: %s; disabling hardware specs" %
24
+ [ err.class, err.message ]
23
25
  config.filter_run_excluding( :hardware )
24
26
  end
25
27
 
data.tar.gz.sig ADDED
@@ -0,0 +1 @@
1
+ P�Fn����5^%s2�l�ęo��F�����B� b��"