ant-wireless 0.1.0.pre.20210617213631

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.
@@ -0,0 +1,10 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'ant' unless defined?( Ant )
5
+
6
+
7
+ class Ant::Message
8
+
9
+ end # class Ant::Message
10
+
data/lib/ant/mixins.rb ADDED
@@ -0,0 +1,34 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'ant' unless defined?( Ant )
5
+
6
+
7
+ module Ant
8
+
9
+ module DataUtilities
10
+
11
+ # The range of ASCII codes to show literally in a hexdump
12
+ VISIBLES = 32..126
13
+
14
+
15
+ ###############
16
+ module_function
17
+ ###############
18
+
19
+ ### Return the given data in hexdump format.
20
+ def hexdump( data, line_size=8 )
21
+ hex_width = line_size * 5
22
+ return data.bytes.each_slice( line_size ).with_index.map do |chunk, line|
23
+ bytes = chunk.map do |b|
24
+ "0x%02x" % [ b ]
25
+ end.join( ' ' )
26
+ stripped_bytes = chunk.map {|c| VISIBLES.include?(c) ? c.chr : '.'}.join
27
+ "%04x: %*s | %*s |" % [ line, -hex_width, bytes, -line_size, stripped_bytes ]
28
+ end.join( "\n" )
29
+ end
30
+
31
+ end
32
+
33
+
34
+ end # module Ant
@@ -0,0 +1,528 @@
1
+ # -*- ruby -*-
2
+ # frozen_string_literal: true
3
+
4
+ require 'loggability'
5
+
6
+ require 'ant' unless defined?( Ant )
7
+
8
+
9
+ # A module that handles response callbacks by logging them.
10
+ module Ant::ResponseCallbacks
11
+ extend Loggability
12
+
13
+ # Loggability API -- send logs to the Ant logger
14
+ log_to :ant
15
+
16
+
17
+ # Mapping of response message IDs to handler methods
18
+ HANDLER_METHODS = {
19
+ Ant::Message::MESG_VERSION_ID => :on_version,
20
+ Ant::Message::MESG_RESPONSE_EVENT_ID => :on_response_event,
21
+
22
+ Ant::Message::MESG_UNASSIGN_CHANNEL_ID => :on_unassign_channel,
23
+ 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,
26
+ 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
+ Ant::Message::MESG_OPEN_CHANNEL_ID => :on_open_channel,
32
+ Ant::Message::MESG_CLOSE_CHANNEL_ID => :on_close_channel,
33
+ Ant::Message::MESG_REQUEST_ID => :on_request,
34
+
35
+ Ant::Message::MESG_BROADCAST_DATA_ID => :on_broadcast_data,
36
+ Ant::Message::MESG_ACKNOWLEDGED_DATA_ID => :on_acknowledged_data,
37
+ Ant::Message::MESG_BURST_DATA_ID => :on_burst_data,
38
+
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,
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,
77
+
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,
93
+ }
94
+
95
+
96
+
97
+ ### Default callback hook -- handles response callbacks.
98
+ def handle_response_callback( channel_num, message_id, data )
99
+ handler_method = HANDLER_METHODS[ message_id ] or
100
+ raise "Unhandled response message ID %p" % [ message_id ]
101
+
102
+ if self.respond_to?( handler_method )
103
+ self.public_send( handler_method, channel_num, data )
104
+ else
105
+ Ant::ResponseCallbacks.log_response_callback( channel_num, handler_method, message_id, data )
106
+ end
107
+ end
108
+
109
+
110
+ ### Log the response event by default.
111
+ def self::log_response_callback( channel_num, handler_method, message_id, data )
112
+ self.log.debug "Response for channel %d: %#0x (%s): %s" % [
113
+ channel_num,
114
+ message_id,
115
+ handler_method,
116
+ data.bytes[ 0..3 ].map {|b| "%#02x" % b }.join( ' ' )
117
+ ]
118
+ end
119
+
120
+
121
+ #
122
+ # Handlers
123
+ #
124
+
125
+ ### Handle version number response messages.
126
+ def on_version( channel_num, data )
127
+ self.log.info "ANT Version %s" % [ data ]
128
+ end
129
+
130
+
131
+ ### Handle event response messages.
132
+ def on_response_event( channel_num, data )
133
+ response_event = data.bytes[ 1 ]
134
+ self.handle_response_callback( channel_num, response_event, data )
135
+ end
136
+
137
+
138
+ ### Handle startup response messages.
139
+ def on_startup_mesg( channel_num, data )
140
+ reason = case data.bytes[ 0 ]
141
+ when Ant::RESET_POR
142
+ "RESET_POR"
143
+ when Ant::RESET_SUSPEND
144
+ "RESET_SUSPEND "
145
+ when Ant::RESET_SYNC
146
+ "RESET_SYNC "
147
+ when Ant::RESET_CMD
148
+ "RESET_CMD "
149
+ when Ant::RESET_WDT
150
+ "RESET_WDT "
151
+ when Ant::RESET_RST
152
+ "RESET_RST "
153
+ else
154
+ "UNKNOWN REASON"
155
+ end
156
+
157
+ self.log.info "Reset complete: %s" % [ reason ]
158
+ end
159
+
160
+
161
+ ### Handle network key event response messages.
162
+ def on_network_key( channel_num, data )
163
+ self.log_response_event( channel_num, data, "setting network key", "Network key set" )
164
+ end
165
+
166
+
167
+ ### Handle channel assignment event response messages.
168
+ def on_assign_channel( channel_num, data )
169
+ self.log_response_event( channel_num, data, "assigning channel", "Channel assigned." )
170
+ end
171
+
172
+
173
+ ### Handle channel unassignment event response messages.
174
+ def on_unassign_channel
175
+ self.log_response_event( channel_num, data, "unassigning channel", "Channel unassigned." )
176
+ end
177
+
178
+
179
+ ### Handle channel ID event response messages.
180
+ def on_channel_id( channel_num, data )
181
+ self.log_response_event( channel_num, data, "setting channel ID", "Channel ID set." )
182
+ end
183
+
184
+
185
+ ### Handle redio frequency event response messages.
186
+ def on_channel_radio_freq( channel_num, data )
187
+ self.log_response_event( channel_num, data, "setting channel radio frequency",
188
+ "Channel radio frequency set." )
189
+ end
190
+
191
+
192
+ ### Handle channel open event response messages.
193
+ def on_open_channel( channel_num, data )
194
+ self.log_response_event( channel_num, data, "opening channel", "Channel opened." )
195
+ end
196
+
197
+
198
+ ### Handle channel close event response messages.
199
+ def on_close_channel( channel_num, data )
200
+ self.log_response_event( channel_num, data, "closing channel", "Channel closed." )
201
+ end
202
+
203
+
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
+ ### Handle channel_mesg_period response events.
216
+ def on_channel_mesg_period( channel_num, data )
217
+ self.log_response_event( channel_num, data, "channel_mesg_period", "Channel period assigned." )
218
+ end
219
+
220
+
221
+ ### Handle channel_search_timeout response event.
222
+ def on_channel_search_timeout( channel_num, data )
223
+ self.log_response_event( channel_num, data, "channel_search_timeout", "Channel assigned." )
224
+ end
225
+
226
+
227
+ ### Handle radio_tx_power response event.
228
+ 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." )
248
+ end
249
+
250
+
251
+ ### Handle broadcast_data response event.
252
+ def on_broadcast_data( channel_num, data )
253
+ self.log_response_event( channel_num, data, "broadcast_data", "Channel assigned." )
254
+ end
255
+
256
+
257
+ ### Handle acknowledged_data response event.
258
+ def on_acknowledged_data( channel_num, data )
259
+ self.log_response_event( channel_num, data, "acknowledged_data", "Channel assigned." )
260
+ end
261
+
262
+
263
+ ### Handle burst_data response event.
264
+ def on_burst_data( channel_num, data )
265
+ self.log_response_event( channel_num, data, "burst_data", "Channel assigned." )
266
+ end
267
+
268
+
269
+ ### Handle channel_status response event.
270
+ 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." )
356
+ end
357
+
358
+
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.
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
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." )
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." )
500
+ end
501
+
502
+
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." )
524
+ end
525
+
526
+
527
+ end # module Ant::ResponseCallbacks
528
+