43
43
#include "shared-bindings/_bleio/__init__.h"
44
44
#include "shared-bindings/_bleio/Adapter.h"
45
45
#include "shared-bindings/_bleio/Address.h"
46
+ #include "shared-bindings/_bleio/Characteristic.h"
47
+ #include "shared-bindings/_bleio/Service.h"
46
48
#include "shared-bindings/nvm/ByteArray.h"
47
49
#include "shared-bindings/_bleio/Connection.h"
48
50
#include "shared-bindings/_bleio/ScanEntry.h"
70
72
71
73
bleio_connection_internal_t bleio_connections [BLEIO_TOTAL_CONNECTION_COUNT ];
72
74
75
+ STATIC void check_enabled (bleio_adapter_obj_t * adapter ) {
76
+ if (!common_hal_bleio_adapter_get_enabled (adapter )) {
77
+ mp_raise_bleio_BluetoothError (translate ("Adapter not enabled" ));
78
+ }
79
+ }
80
+
73
81
// STATIC bool adapter_on_ble_evt(ble_evt_t *ble_evt, void *self_in) {
74
82
// bleio_adapter_obj_t *self = (bleio_adapter_obj_t*)self_in;
75
83
@@ -232,6 +240,14 @@ void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enable
232
240
233
241
self -> enabled = enabled ;
234
242
243
+ // We must poll for input from the HCI adapter.
244
+ // TODO Can we instead trigger an interrupt on UART input traffic?
245
+ if (enabled ) {
246
+ supervisor_enable_tick ();
247
+ } else {
248
+ supervisor_disable_tick ();
249
+ }
250
+
235
251
// Stop any current activity; reset to known state.
236
252
check_hci_error (hci_reset ());
237
253
self -> now_advertising = false;
@@ -253,6 +269,8 @@ bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) {
253
269
}
254
270
255
271
bleio_address_obj_t * common_hal_bleio_adapter_get_address (bleio_adapter_obj_t * self ) {
272
+ check_enabled (self );
273
+
256
274
bt_addr_t addr ;
257
275
check_hci_error (hci_read_bd_addr (& addr ));
258
276
@@ -306,6 +324,8 @@ void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char* na
306
324
// }
307
325
308
326
mp_obj_t common_hal_bleio_adapter_start_scan (bleio_adapter_obj_t * self , uint8_t * prefixes , size_t prefix_length , bool extended , mp_int_t buffer_size , mp_float_t timeout , mp_float_t interval , mp_float_t window , mp_int_t minimum_rssi , bool active ) {
327
+ check_enabled (self );
328
+
309
329
if (self -> scan_results != NULL ) {
310
330
if (!shared_module_bleio_scanresults_get_done (self -> scan_results )) {
311
331
mp_raise_bleio_BluetoothError (translate ("Scan already in progess. Stop with stop_scan." ));
@@ -350,6 +370,8 @@ mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t*
350
370
}
351
371
352
372
void common_hal_bleio_adapter_stop_scan (bleio_adapter_obj_t * self ) {
373
+ check_enabled (self );
374
+
353
375
check_hci_error (hci_le_set_scan_enable (BT_HCI_LE_SCAN_DISABLE , BT_HCI_LE_SCAN_FILTER_DUP_DISABLE ));
354
376
shared_module_bleio_scanresults_set_done (self -> scan_results , true);
355
377
self -> scan_results = NULL ;
@@ -385,6 +407,8 @@ void common_hal_bleio_adapter_stop_scan(bleio_adapter_obj_t *self) {
385
407
386
408
mp_obj_t common_hal_bleio_adapter_connect (bleio_adapter_obj_t * self , bleio_address_obj_t * address , mp_float_t timeout ) {
387
409
410
+ check_enabled (self );
411
+
388
412
// ble_gap_addr_t addr;
389
413
390
414
// addr.addr_type = address->type;
@@ -482,6 +506,8 @@ STATIC void check_data_fit(size_t data_len, bool connectable) {
482
506
// }
483
507
484
508
uint32_t _common_hal_bleio_adapter_start_advertising (bleio_adapter_obj_t * self , bool connectable , bool anonymous , uint32_t timeout , float interval , uint8_t * advertising_data , uint16_t advertising_data_len , uint8_t * scan_response_data , uint16_t scan_response_data_len ) {
509
+ check_enabled (self );
510
+
485
511
if (self -> now_advertising ) {
486
512
if (self -> circuitpython_advertising ) {
487
513
common_hal_bleio_adapter_stop_advertising (self );
@@ -603,6 +629,8 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self,
603
629
}
604
630
605
631
void common_hal_bleio_adapter_start_advertising (bleio_adapter_obj_t * self , bool connectable , bool anonymous , uint32_t timeout , mp_float_t interval , mp_buffer_info_t * advertising_data_bufinfo , mp_buffer_info_t * scan_response_data_bufinfo ) {
632
+ check_enabled (self );
633
+
606
634
// interval value has already been validated.
607
635
608
636
check_data_fit (advertising_data_bufinfo -> len , connectable );
@@ -638,6 +666,8 @@ void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool
638
666
}
639
667
640
668
void common_hal_bleio_adapter_stop_advertising (bleio_adapter_obj_t * self ) {
669
+ check_enabled (self );
670
+
641
671
self -> now_advertising = false;
642
672
self -> extended_advertising = false;
643
673
self -> circuitpython_advertising = false;
@@ -651,10 +681,14 @@ void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self) {
651
681
}
652
682
653
683
bool common_hal_bleio_adapter_get_advertising (bleio_adapter_obj_t * self ) {
684
+ check_enabled (self );
685
+
654
686
return self -> now_advertising ;
655
687
}
656
688
657
689
bool common_hal_bleio_adapter_get_connected (bleio_adapter_obj_t * self ) {
690
+ check_enabled (self );
691
+
658
692
for (size_t i = 0 ; i < BLEIO_TOTAL_CONNECTION_COUNT ; i ++ ) {
659
693
bleio_connection_internal_t * connection = & bleio_connections [i ];
660
694
if (connection -> conn_handle != BLE_CONN_HANDLE_INVALID ) {
@@ -665,6 +699,8 @@ bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self) {
665
699
}
666
700
667
701
mp_obj_t common_hal_bleio_adapter_get_connections (bleio_adapter_obj_t * self ) {
702
+ check_enabled (self );
703
+
668
704
if (self -> connection_objs != NULL ) {
669
705
return self -> connection_objs ;
670
706
}
@@ -685,24 +721,40 @@ mp_obj_t common_hal_bleio_adapter_get_connections(bleio_adapter_obj_t *self) {
685
721
}
686
722
687
723
void common_hal_bleio_adapter_erase_bonding (bleio_adapter_obj_t * self ) {
724
+ check_enabled (self );
725
+
688
726
//FIX bonding_erase_storage();
689
727
}
690
728
691
729
uint16_t bleio_adapter_add_attribute (bleio_adapter_obj_t * adapter , mp_obj_t * attribute ) {
730
+ check_enabled (adapter );
731
+
692
732
// The handle is the index of this attribute in the attributes list.
693
733
uint16_t handle = (uint16_t ) adapter -> attributes -> len ;
694
734
mp_obj_list_append (adapter -> attributes , attribute );
735
+
736
+ if (MP_OBJ_IS_TYPE (attribute , & bleio_service_type )) {
737
+ adapter -> last_added_service_handle = handle ;
738
+ }
739
+ if (MP_OBJ_IS_TYPE (attribute , & bleio_characteristic_type )) {
740
+ adapter -> last_added_characteristic_handle = handle ;
741
+ }
742
+
695
743
return handle ;
696
744
}
697
745
698
746
mp_obj_t * bleio_adapter_get_attribute (bleio_adapter_obj_t * adapter , uint16_t handle ) {
747
+ check_enabled (adapter );
748
+
699
749
if (handle == 0 || handle >= adapter -> attributes -> len ) {
700
750
return mp_const_none ;
701
751
}
702
752
return adapter -> attributes -> items [handle ];
703
753
}
704
754
705
755
uint16_t bleio_adapter_max_attribute_handle (bleio_adapter_obj_t * adapter ) {
756
+ check_enabled (adapter );
757
+
706
758
return adapter -> attributes -> len - 1 ;
707
759
}
708
760
@@ -713,6 +765,10 @@ void bleio_adapter_gc_collect(bleio_adapter_obj_t* adapter) {
713
765
}
714
766
715
767
void bleio_adapter_reset (bleio_adapter_obj_t * adapter ) {
768
+ if (!common_hal_bleio_adapter_get_enabled (adapter )) {
769
+ return ;
770
+ }
771
+
716
772
common_hal_bleio_adapter_stop_scan (adapter );
717
773
if (adapter -> now_advertising ) {
718
774
common_hal_bleio_adapter_stop_advertising (adapter );
@@ -731,6 +787,10 @@ void bleio_adapter_reset(bleio_adapter_obj_t* adapter) {
731
787
}
732
788
733
789
void bleio_adapter_background (bleio_adapter_obj_t * adapter ) {
790
+ if (!common_hal_bleio_adapter_get_enabled (adapter )) {
791
+ return ;
792
+ }
793
+
734
794
if (adapter -> advertising_timeout_msecs > 0 &&
735
795
supervisor_ticks_ms64 () - adapter -> advertising_start_ticks > adapter -> advertising_timeout_msecs ) {
736
796
adapter -> advertising_timeout_msecs = 0 ;
0 commit comments