@@ -158,6 +158,10 @@ pbio_error_t pbdrv_bluetooth_peripheral_scan_and_connect(pbdrv_bluetooth_periphe
158158
159159 pbdrv_bluetooth_peripheral_t * peri = & peripheral_singleton ;
160160
161+ if (!pbdrv_bluetooth_is_connected (PBDRV_BLUETOOTH_CONNECTION_HCI )) {
162+ return PBIO_ERROR_INVALID_OP ;
163+ }
164+
161165 // Can't connect if already connected or already busy.
162166 if (pbdrv_bluetooth_is_connected (PBDRV_BLUETOOTH_CONNECTION_PERIPHERAL ) || peri -> func ) {
163167 return PBIO_ERROR_BUSY ;
@@ -300,6 +304,10 @@ pbdrv_bluetooth_advertising_state_t pbdrv_bluetooth_advertising_state;
300304
301305pbio_error_t pbdrv_bluetooth_start_advertising (bool start ) {
302306
307+ if (!pbdrv_bluetooth_is_connected (PBDRV_BLUETOOTH_CONNECTION_HCI )) {
308+ return PBIO_ERROR_INVALID_OP ;
309+ }
310+
303311 bool is_advertising = pbdrv_bluetooth_advertising_state == PBDRV_BLUETOOTH_ADVERTISING_STATE_ADVERTISING_PYBRICKS ;
304312
305313 // Already in requested state. This makes it safe to call stop advertising
@@ -330,6 +338,10 @@ uint8_t pbdrv_bluetooth_broadcast_data_size;
330338
331339pbio_error_t pbdrv_bluetooth_start_broadcasting (const uint8_t * data , size_t size ) {
332340
341+ if (!pbdrv_bluetooth_is_connected (PBDRV_BLUETOOTH_CONNECTION_HCI )) {
342+ return PBIO_ERROR_INVALID_OP ;
343+ }
344+
333345 if (advertising_or_scan_func ) {
334346 return PBIO_ERROR_BUSY ;
335347 }
@@ -374,6 +386,10 @@ pbdrv_bluetooth_start_observing_callback_t pbdrv_bluetooth_observe_callback;
374386
375387pbio_error_t pbdrv_bluetooth_start_observing (pbdrv_bluetooth_start_observing_callback_t callback ) {
376388
389+ if (!pbdrv_bluetooth_is_connected (PBDRV_BLUETOOTH_CONNECTION_HCI )) {
390+ return PBIO_ERROR_INVALID_OP ;
391+ }
392+
377393 if (advertising_or_scan_func ) {
378394 return PBIO_ERROR_BUSY ;
379395 }
@@ -593,14 +609,19 @@ pbio_error_t pbdrv_bluetooth_close_user_tasks(pbio_os_state_t *state, pbio_os_ti
593609
594610void pbdrv_bluetooth_deinit (void ) {
595611
612+ // If Bluetooth is not even initialized, nothing to do.
613+ if (!pbdrv_bluetooth_is_connected (PBDRV_BLUETOOTH_CONNECTION_HCI )) {
614+ return ;
615+ }
616+
596617 // Under normal operation ::pbdrv_bluetooth_close_user_tasks completes
597618 // normally and there should be no user activity at this point. If there
598619 // is, a task got stuck, so exit forcefully.
599620 pbio_os_state_t unused ;
600621 if (pbdrv_bluetooth_await_advertise_or_scan_command (& unused , NULL ) != PBIO_SUCCESS ||
601622 pbdrv_bluetooth_await_peripheral_command (& unused , NULL ) != PBIO_SUCCESS ) {
602623
603- // Hard reset without waitng on completion of any process.
624+ // Hard reset without waiting on completion of any process.
604625 pbdrv_bluetooth_controller_reset_hard ();
605626 return ;
606627 }
0 commit comments