@@ -774,8 +774,8 @@ const mp_obj_module_t mp_module_ubluetooth = {
774774
775775#include <stdio.h>
776776
777- STATIC void ringbuf_extract (ringbuf_t * ringbuf , mp_obj_tuple_t * data_tuple , size_t n_u16 , size_t n_u8 , mp_obj_str_t * bytes_addr , size_t n_b , size_t n_i8 , mp_obj_bluetooth_uuid_t * uuid , mp_obj_str_t * bytes_data ) {
778- assert (ringbuf_avail (ringbuf ) >= n_u16 * 2 + n_u8 + (bytes_addr ? 6 : 0 ) + n_b + n_i8 + (uuid ? 1 : 0 ) + (bytes_data ? 1 : 0 ));
777+ STATIC void ringbuf_extract (ringbuf_t * ringbuf , mp_obj_tuple_t * data_tuple , size_t n_u16 , size_t n_u8 , mp_obj_str_t * bytes_addr , size_t n_i8 , mp_obj_bluetooth_uuid_t * uuid , mp_obj_str_t * bytes_data ) {
778+ assert (ringbuf_avail (ringbuf ) >= n_u16 * 2 + n_u8 + (bytes_addr ? 6 : 0 ) + n_i8 + (uuid ? 1 : 0 ) + (bytes_data ? 1 : 0 ));
779779 int j = 0 ;
780780
781781 for (int i = 0 ; i < n_u16 ; ++ i ) {
@@ -792,10 +792,7 @@ STATIC void ringbuf_extract(ringbuf_t *ringbuf, mp_obj_tuple_t *data_tuple, size
792792 }
793793 data_tuple -> items [j ++ ] = MP_OBJ_FROM_PTR (bytes_addr );
794794 }
795- if (n_b ) {
796- data_tuple -> items [j ++ ] = mp_obj_new_bool (ringbuf_get (ringbuf ));
797- }
798- if (n_i8 ) {
795+ for (int i = 0 ; i < n_i8 ; ++ i ) {
799796 // Note the int8_t got packed into the ringbuf as a uint8_t.
800797 data_tuple -> items [j ++ ] = MP_OBJ_NEW_SMALL_INT ((int8_t )ringbuf_get (ringbuf ));
801798 }
@@ -843,32 +840,32 @@ STATIC mp_obj_t bluetooth_ble_invoke_irq(mp_obj_t none_in) {
843840
844841 if (event == MP_BLUETOOTH_IRQ_CENTRAL_CONNECT || event == MP_BLUETOOTH_IRQ_PERIPHERAL_CONNECT || event == MP_BLUETOOTH_IRQ_CENTRAL_DISCONNECT || event == MP_BLUETOOTH_IRQ_PERIPHERAL_DISCONNECT ) {
845842 // conn_handle, addr_type, addr
846- ringbuf_extract (& o -> ringbuf , data_tuple , 1 , 1 , & o -> irq_data_addr , 0 , 0 , NULL , NULL );
843+ ringbuf_extract (& o -> ringbuf , data_tuple , 1 , 1 , & o -> irq_data_addr , 0 , NULL , NULL );
847844 } else if (event == MP_BLUETOOTH_IRQ_GATTS_WRITE ) {
848845 // conn_handle, value_handle
849- ringbuf_extract (& o -> ringbuf , data_tuple , 2 , 0 , NULL , 0 , 0 , NULL , NULL );
846+ ringbuf_extract (& o -> ringbuf , data_tuple , 2 , 0 , NULL , 0 , NULL , NULL );
850847 #if MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE
851848 } else if (event == MP_BLUETOOTH_IRQ_SCAN_RESULT ) {
852- // addr_type, addr, connectable , rssi, adv_data
853- ringbuf_extract (& o -> ringbuf , data_tuple , 0 , 1 , & o -> irq_data_addr , 1 , 1 , NULL , & o -> irq_data_data );
849+ // addr_type, addr, adv_type , rssi, adv_data
850+ ringbuf_extract (& o -> ringbuf , data_tuple , 0 , 1 , & o -> irq_data_addr , 2 , NULL , & o -> irq_data_data );
854851 } else if (event == MP_BLUETOOTH_IRQ_SCAN_COMPLETE ) {
855852 // No params required.
856853 data_tuple -> len = 0 ;
857854 } else if (event == MP_BLUETOOTH_IRQ_GATTC_SERVICE_RESULT ) {
858855 // conn_handle, start_handle, end_handle, uuid
859- ringbuf_extract (& o -> ringbuf , data_tuple , 3 , 0 , NULL , 0 , 0 , & o -> irq_data_uuid , NULL );
856+ ringbuf_extract (& o -> ringbuf , data_tuple , 3 , 0 , NULL , 0 , & o -> irq_data_uuid , NULL );
860857 } else if (event == MP_BLUETOOTH_IRQ_GATTC_CHARACTERISTIC_RESULT ) {
861858 // conn_handle, def_handle, value_handle, properties, uuid
862- ringbuf_extract (& o -> ringbuf , data_tuple , 3 , 1 , NULL , 0 , 0 , & o -> irq_data_uuid , NULL );
859+ ringbuf_extract (& o -> ringbuf , data_tuple , 3 , 1 , NULL , 0 , & o -> irq_data_uuid , NULL );
863860 } else if (event == MP_BLUETOOTH_IRQ_GATTC_DESCRIPTOR_RESULT ) {
864861 // conn_handle, handle, uuid
865- ringbuf_extract (& o -> ringbuf , data_tuple , 2 , 0 , NULL , 0 , 0 , & o -> irq_data_uuid , NULL );
862+ ringbuf_extract (& o -> ringbuf , data_tuple , 2 , 0 , NULL , 0 , & o -> irq_data_uuid , NULL );
866863 } else if (event == MP_BLUETOOTH_IRQ_GATTC_READ_RESULT || event == MP_BLUETOOTH_IRQ_GATTC_NOTIFY || event == MP_BLUETOOTH_IRQ_GATTC_INDICATE ) {
867864 // conn_handle, value_handle, data
868- ringbuf_extract (& o -> ringbuf , data_tuple , 2 , 0 , NULL , 0 , 0 , NULL , & o -> irq_data_data );
865+ ringbuf_extract (& o -> ringbuf , data_tuple , 2 , 0 , NULL , 0 , NULL , & o -> irq_data_data );
869866 } else if (event == MP_BLUETOOTH_IRQ_GATTC_WRITE_STATUS ) {
870867 // conn_handle, value_handle, status
871- ringbuf_extract (& o -> ringbuf , data_tuple , 3 , 0 , NULL , 0 , 0 , NULL , NULL );
868+ ringbuf_extract (& o -> ringbuf , data_tuple , 3 , 0 , NULL , 0 , NULL , NULL );
872869 #endif // MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE
873870 }
874871
@@ -903,7 +900,7 @@ STATIC bool enqueue_irq(mp_obj_bluetooth_ble_t *o, size_t len, uint16_t event) {
903900
904901 // Front of the queue is a scan result, remove it.
905902
906- // event, addr_type, addr, connectable , rssi
903+ // event, addr_type, addr, adv_type , rssi
907904 int n = 2 + 1 + 6 + 1 + 1 ;
908905 for (int i = 0 ; i < n ; ++ i ) {
909906 ringbuf_get (& o -> ringbuf );
@@ -963,7 +960,7 @@ void mp_bluetooth_gap_on_scan_complete(void) {
963960 MICROPY_PY_BLUETOOTH_EXIT
964961}
965962
966- 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 ) {
963+ void mp_bluetooth_gap_on_scan_result (uint8_t addr_type , const uint8_t * addr , uint8_t adv_type , const int8_t rssi , const uint8_t * data , size_t data_len ) {
967964 MICROPY_PY_BLUETOOTH_ENTER
968965 mp_obj_bluetooth_ble_t * o = MP_OBJ_TO_PTR (MP_STATE_VM (bluetooth ));
969966 data_len = MIN (o -> irq_data_data_alloc , data_len );
@@ -972,7 +969,8 @@ void mp_bluetooth_gap_on_scan_result(uint8_t addr_type, const uint8_t *addr, boo
972969 for (int i = 0 ; i < 6 ; ++ i ) {
973970 ringbuf_put (& o -> ringbuf , addr [i ]);
974971 }
975- ringbuf_put (& o -> ringbuf , connectable ? 1 : 0 );
972+ // The adv_type will get extracted as an int8_t but that's ok because valid values are 0x00-0x04.
973+ ringbuf_put (& o -> ringbuf , adv_type );
976974 // Note conversion of int8_t rssi to uint8_t. Must un-convert on the way out.
977975 ringbuf_put (& o -> ringbuf , (uint8_t )rssi );
978976 ringbuf_put (& o -> ringbuf , data_len );
0 commit comments