diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index b40fe7a3c0..dcf9fac0a0 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -211,7 +211,6 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { connectionHandle = event->connect.conn_handle; bleController.Connect(); systemTask.PushMessage(Pinetime::System::Messages::BleConnected); - // Service discovery is deferred via systemtask ble_gap_security_initiate(event->connect.conn_handle); } break; @@ -269,6 +268,10 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) { desc.sec_state.authenticated, desc.sec_state.bonded, desc.sec_state.key_size); + + if (desc.sec_state.encrypted) { + systemTask.PushMessage(Pinetime::System::Messages::BleStartDiscovery); + } } break; diff --git a/src/systemtask/Messages.h b/src/systemtask/Messages.h index fee94bb747..7945fb7d1b 100644 --- a/src/systemtask/Messages.h +++ b/src/systemtask/Messages.h @@ -24,6 +24,7 @@ namespace Pinetime { OnNewHalfHour, OnChargingEvent, OnPairing, + BleStartDiscovery, SetOffAlarm, MeasureBatteryTimerExpired, BatteryPercentageUpdated, diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 56bf9273e1..5a4d5b14f8 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -237,8 +237,13 @@ void SystemTask::Work() { break; case Messages::BleConnected: displayApp.PushMessage(Pinetime::Applications::Display::Messages::NotifyDeviceActivity); - isBleDiscoveryTimerRunning = true; - bleDiscoveryTimer = 5; + isBleDiscoveryStarted = false; + break; + case Messages::BleStartDiscovery: + if (!isBleDiscoveryStarted) { + isBleDiscoveryStarted = true; + nimbleController.StartDiscovery(); + } break; case Messages::BleFirmwareUpdateStarted: GoToRunning(); @@ -380,16 +385,6 @@ void SystemTask::Work() { elapsed = xTaskGetTickCount() - lastStateUpdate; if (elapsed >= stateUpdatePeriod) { UpdateMotion(); - if (isBleDiscoveryTimerRunning) { - if (bleDiscoveryTimer == 0) { - isBleDiscoveryTimerRunning = false; - // Services discovery is deferred from 3 seconds to avoid the conflicts between the host communicating with the - // target and vice-versa. I'm not sure if this is the right way to handle this... - nimbleController.StartDiscovery(); - } else { - bleDiscoveryTimer--; - } - } monitor.Process(); NoInit_BackUpTime = dateTimeController.CurrentDateTime(); if (nrf_gpio_pin_read(PinMap::Button) == 0) { diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index 606ddd3492..fd1f9d3221 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -130,8 +130,7 @@ namespace Pinetime { static void Process(void* instance); void Work(); - bool isBleDiscoveryTimerRunning = false; - uint8_t bleDiscoveryTimer = 0; + bool isBleDiscoveryStarted = false; TimerHandle_t measureBatteryTimer; uint8_t wakeLocksHeld = 0; SystemTaskState state = SystemTaskState::Running;