@@ -60,6 +60,7 @@ typedef struct {
60
60
mp_obj_base_t base ;
61
61
mp_obj_t irq_handler ;
62
62
uint16_t irq_trigger ;
63
+ bool irq_scheduled ;
63
64
mp_obj_t irq_data_tuple ;
64
65
uint8_t irq_data_addr_bytes [6 ];
65
66
uint8_t irq_data_data_bytes [MICROPY_PY_BLUETOOTH_MAX_EVENT_DATA_BYTES_LEN ];
@@ -757,9 +758,12 @@ STATIC void ringbuf_extract(ringbuf_t* ringbuf, mp_obj_tuple_t *data_tuple, size
757
758
758
759
STATIC mp_obj_t bluetooth_ble_invoke_irq (mp_obj_t none_in ) {
759
760
// This is always executing in schedule context.
761
+
762
+ mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
763
+ o -> irq_scheduled = false;
764
+
760
765
for (;;) {
761
766
MICROPY_PY_BLUETOOTH_ENTER
762
- mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
763
767
764
768
mp_int_t event = event = ringbuf_get16 (& o -> ringbuf );
765
769
if (event < 0 ) {
@@ -822,9 +826,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(bluetooth_ble_invoke_irq_obj, bluetooth_ble_inv
822
826
// Callbacks are called in interrupt context (i.e. can't allocate), so we need to push the data
823
827
// into the ringbuf and schedule the callback via mp_sched_schedule.
824
828
825
- STATIC bool enqueue_irq (mp_obj_bluetooth_ble_t * o , size_t len , uint16_t event , bool * sched ) {
826
- * sched = false;
827
-
829
+ STATIC bool enqueue_irq (mp_obj_bluetooth_ble_t * o , size_t len , uint16_t event ) {
828
830
if (!o || !(o -> irq_trigger & event ) || o -> irq_handler == mp_const_none ) {
829
831
return false;
830
832
}
@@ -849,68 +851,61 @@ STATIC bool enqueue_irq(mp_obj_bluetooth_ble_t *o, size_t len, uint16_t event, b
849
851
for (int i = 0 ; i < n ; ++ i ) {
850
852
ringbuf_get (& o -> ringbuf );
851
853
}
852
-
853
- // No need to schedule the handler, as the ringbuffer was non-empty.
854
- } else {
855
- // Schedule the handler only if this is the first thing in the ringbuffer.
856
- * sched = ringbuf_avail (& o -> ringbuf ) == 0 ;
857
854
}
858
855
859
856
// Append this event, the caller will then append the arguments.
860
857
ringbuf_put16 (& o -> ringbuf , event );
861
858
return true;
862
859
}
863
860
864
- STATIC void schedule_ringbuf (bool sched ) {
865
- if (sched ) {
861
+ STATIC void schedule_ringbuf (void ) {
862
+ mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
863
+ if (!o -> irq_scheduled ) {
864
+ o -> irq_scheduled = true;
866
865
mp_sched_schedule (MP_OBJ_FROM_PTR (MP_ROM_PTR (& bluetooth_ble_invoke_irq_obj )), mp_const_none );
867
866
}
868
867
}
869
868
870
869
void mp_bluetooth_gap_on_connected_disconnected (uint16_t event , uint16_t conn_handle , uint8_t addr_type , const uint8_t * addr ) {
871
870
MICROPY_PY_BLUETOOTH_ENTER
872
871
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
873
- bool sched ;
874
- if (enqueue_irq (o , 2 + 1 + 6 , event , & sched )) {
872
+ if (enqueue_irq (o , 2 + 1 + 6 , event )) {
875
873
ringbuf_put16 (& o -> ringbuf , conn_handle );
876
874
ringbuf_put (& o -> ringbuf , addr_type );
877
875
for (int i = 0 ; i < 6 ; ++ i ) {
878
876
ringbuf_put (& o -> ringbuf , addr [i ]);
879
877
}
880
878
}
879
+ schedule_ringbuf ();
881
880
MICROPY_PY_BLUETOOTH_EXIT
882
- schedule_ringbuf (sched );
883
881
}
884
882
885
883
void mp_bluetooth_gatts_on_write (uint16_t conn_handle , uint16_t value_handle ) {
886
884
MICROPY_PY_BLUETOOTH_ENTER
887
885
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
888
- bool sched ;
889
- if (enqueue_irq (o , 2 + 2 , MP_BLUETOOTH_IRQ_GATTS_WRITE , & sched )) {
886
+ if (enqueue_irq (o , 2 + 2 , MP_BLUETOOTH_IRQ_GATTS_WRITE )) {
890
887
ringbuf_put16 (& o -> ringbuf , conn_handle );
891
888
ringbuf_put16 (& o -> ringbuf , value_handle );
892
889
}
890
+ schedule_ringbuf ();
893
891
MICROPY_PY_BLUETOOTH_EXIT
894
- schedule_ringbuf (sched );
895
892
}
896
893
897
894
#if MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE
898
895
void mp_bluetooth_gap_on_scan_complete (void ) {
899
896
MICROPY_PY_BLUETOOTH_ENTER
900
897
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
901
- bool sched ;
902
- if (enqueue_irq (o , 0 , MP_BLUETOOTH_IRQ_SCAN_COMPLETE , & sched )) {
898
+ if (enqueue_irq (o , 0 , MP_BLUETOOTH_IRQ_SCAN_COMPLETE )) {
903
899
}
900
+ schedule_ringbuf ();
904
901
MICROPY_PY_BLUETOOTH_EXIT
905
- schedule_ringbuf (sched );
906
902
}
907
903
908
904
void mp_bluetooth_gap_on_scan_result (uint8_t addr_type , const uint8_t * addr , bool connectable , const int8_t rssi , const uint8_t * data , size_t data_len ) {
909
905
MICROPY_PY_BLUETOOTH_ENTER
910
906
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
911
- bool sched ;
912
907
data_len = MIN (MICROPY_PY_BLUETOOTH_MAX_EVENT_DATA_BYTES_LEN , data_len );
913
- if (enqueue_irq (o , 1 + 6 + 1 + 1 + 1 + data_len , MP_BLUETOOTH_IRQ_SCAN_RESULT , & sched )) {
908
+ if (enqueue_irq (o , 1 + 6 + 1 + 1 + 1 + data_len , MP_BLUETOOTH_IRQ_SCAN_RESULT )) {
914
909
ringbuf_put (& o -> ringbuf , addr_type );
915
910
for (int i = 0 ; i < 6 ; ++ i ) {
916
911
ringbuf_put (& o -> ringbuf , addr [i ]);
@@ -923,80 +918,75 @@ void mp_bluetooth_gap_on_scan_result(uint8_t addr_type, const uint8_t *addr, boo
923
918
ringbuf_put (& o -> ringbuf , data [i ]);
924
919
}
925
920
}
921
+ schedule_ringbuf ();
926
922
MICROPY_PY_BLUETOOTH_EXIT
927
- schedule_ringbuf (sched );
928
923
}
929
924
930
925
void mp_bluetooth_gattc_on_primary_service_result (uint16_t conn_handle , uint16_t start_handle , uint16_t end_handle , mp_obj_bluetooth_uuid_t * service_uuid ) {
931
926
MICROPY_PY_BLUETOOTH_ENTER
932
927
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
933
- bool sched ;
934
- if (enqueue_irq (o , 2 + 2 + 2 + 1 + service_uuid -> type , MP_BLUETOOTH_IRQ_GATTC_SERVICE_RESULT , & sched )) {
928
+ if (enqueue_irq (o , 2 + 2 + 2 + 1 + service_uuid -> type , MP_BLUETOOTH_IRQ_GATTC_SERVICE_RESULT )) {
935
929
ringbuf_put16 (& o -> ringbuf , conn_handle );
936
930
ringbuf_put16 (& o -> ringbuf , start_handle );
937
931
ringbuf_put16 (& o -> ringbuf , end_handle );
938
932
ringbuf_put_uuid (& o -> ringbuf , service_uuid );
939
933
}
934
+ schedule_ringbuf ();
940
935
MICROPY_PY_BLUETOOTH_EXIT
941
- schedule_ringbuf (sched );
942
936
}
943
937
944
938
void mp_bluetooth_gattc_on_characteristic_result (uint16_t conn_handle , uint16_t def_handle , uint16_t value_handle , uint8_t properties , mp_obj_bluetooth_uuid_t * characteristic_uuid ) {
945
939
MICROPY_PY_BLUETOOTH_ENTER
946
940
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
947
- bool sched ;
948
- if (enqueue_irq (o , 2 + 2 + 2 + 1 + characteristic_uuid -> type , MP_BLUETOOTH_IRQ_GATTC_CHARACTERISTIC_RESULT , & sched )) {
941
+ if (enqueue_irq (o , 2 + 2 + 2 + 1 + characteristic_uuid -> type , MP_BLUETOOTH_IRQ_GATTC_CHARACTERISTIC_RESULT )) {
949
942
ringbuf_put16 (& o -> ringbuf , conn_handle );
950
943
ringbuf_put16 (& o -> ringbuf , def_handle );
951
944
ringbuf_put16 (& o -> ringbuf , value_handle );
952
945
ringbuf_put (& o -> ringbuf , properties );
953
946
ringbuf_put_uuid (& o -> ringbuf , characteristic_uuid );
954
947
}
948
+ schedule_ringbuf ();
955
949
MICROPY_PY_BLUETOOTH_EXIT
956
- schedule_ringbuf (sched );
957
950
}
958
951
959
952
void mp_bluetooth_gattc_on_descriptor_result (uint16_t conn_handle , uint16_t handle , mp_obj_bluetooth_uuid_t * descriptor_uuid ) {
960
953
MICROPY_PY_BLUETOOTH_ENTER
961
954
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
962
- bool sched ;
963
- if (enqueue_irq (o , 2 + 2 + 1 + descriptor_uuid -> type , MP_BLUETOOTH_IRQ_GATTC_DESCRIPTOR_RESULT , & sched )) {
955
+ if (enqueue_irq (o , 2 + 2 + 1 + descriptor_uuid -> type , MP_BLUETOOTH_IRQ_GATTC_DESCRIPTOR_RESULT )) {
964
956
ringbuf_put16 (& o -> ringbuf , conn_handle );
965
957
ringbuf_put16 (& o -> ringbuf , handle );
966
958
ringbuf_put_uuid (& o -> ringbuf , descriptor_uuid );
967
959
}
960
+ schedule_ringbuf ();
968
961
MICROPY_PY_BLUETOOTH_EXIT
969
- schedule_ringbuf (sched );
970
962
}
971
963
972
964
void mp_bluetooth_gattc_on_data_available (uint16_t event , uint16_t conn_handle , uint16_t value_handle , const uint8_t * data , size_t data_len ) {
973
965
MICROPY_PY_BLUETOOTH_ENTER
974
966
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
975
- bool sched ;
976
967
data_len = MIN (MICROPY_PY_BLUETOOTH_MAX_EVENT_DATA_BYTES_LEN , data_len );
977
- if (enqueue_irq (o , 2 + 2 + 1 + data_len , event , & sched )) {
968
+ if (enqueue_irq (o , 2 + 2 + 1 + data_len , event )) {
978
969
ringbuf_put16 (& o -> ringbuf , conn_handle );
979
970
ringbuf_put16 (& o -> ringbuf , value_handle );
980
971
ringbuf_put (& o -> ringbuf , data_len );
981
972
for (int i = 0 ; i < data_len ; ++ i ) {
982
973
ringbuf_put (& o -> ringbuf , data [i ]);
983
974
}
984
975
}
976
+ schedule_ringbuf ();
985
977
MICROPY_PY_BLUETOOTH_EXIT
986
- schedule_ringbuf (sched );
987
978
}
988
979
989
980
void mp_bluetooth_gattc_on_write_status (uint16_t conn_handle , uint16_t value_handle , uint16_t status ) {
990
981
MICROPY_PY_BLUETOOTH_ENTER
991
982
mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
992
- bool sched ;
993
- if (enqueue_irq (o , 2 + 2 + 2 , MP_BLUETOOTH_IRQ_GATTC_WRITE_STATUS , & sched )) {
983
+ if (enqueue_irq (o , 2 + 2 + 2 , MP_BLUETOOTH_IRQ_GATTC_WRITE_STATUS )) {
994
984
ringbuf_put16 (& o -> ringbuf , conn_handle );
995
985
ringbuf_put16 (& o -> ringbuf , value_handle );
996
986
ringbuf_put16 (& o -> ringbuf , status );
997
987
}
988
+ schedule_ringbuf ();
998
989
MICROPY_PY_BLUETOOTH_EXIT
999
- schedule_ringbuf (sched );
1000
990
}
1001
991
1002
992
#endif // MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE
0 commit comments