summaryrefslogtreecommitdiff
path: root/src/components/ble/NimbleController.cpp
diff options
context:
space:
mode:
authorMax Friedrich <minacode@users.noreply.github.com>2022-04-19 00:40:29 +0200
committerGitHub <noreply@github.com>2022-04-19 00:40:29 +0200
commitf84a0a38972e6b6d9a537dc9de2e2c416312f882 (patch)
tree3ce9dab83f8b6af8e9df1c8d3aa0219f5a67acbe /src/components/ble/NimbleController.cpp
parenta1db9fca136493eef38e536abaa660dd6ce23e57 (diff)
parented91b5a9981898078ad8e4cf105b5d52c7b63dfe (diff)
Merge branch 'develop' into remove-nm-reference
Diffstat (limited to 'src/components/ble/NimbleController.cpp')
-rw-r--r--src/components/ble/NimbleController.cpp43
1 files changed, 33 insertions, 10 deletions
diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp
index c7ceed32..d2d6dc03 100644
--- a/src/components/ble/NimbleController.cpp
+++ b/src/components/ble/NimbleController.cpp
@@ -2,6 +2,7 @@
#include <cstring>
#include <hal/nrf_rtc.h>
+#include <nrf_log.h>
#define min // workaround: nimble's min/max macros conflict with libstdc++
#define max
#include <host/ble_gap.h>
@@ -23,14 +24,14 @@
using namespace Pinetime::Controllers;
NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
- Pinetime::Controllers::Ble& bleController,
+ Ble& bleController,
DateTime& dateTimeController,
- Pinetime::Controllers::NotificationManager& notificationManager,
- Controllers::Battery& batteryController,
+ NotificationManager& notificationManager,
+ Battery& batteryController,
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
- Controllers::HeartRateController& heartRateController,
- Controllers::MotionController& motionController,
- Controllers::FS& fs)
+ HeartRateController& heartRateController,
+ MotionController& motionController,
+ FS& fs)
: systemTask {systemTask},
bleController {bleController},
dateTimeController {dateTimeController},
@@ -75,6 +76,7 @@ int GAPEventCallback(struct ble_gap_event* event, void* arg) {
void NimbleController::Init() {
while (!ble_hs_synced()) {
+ vTaskDelay(10);
}
nptr = this;
@@ -183,7 +185,9 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
case BLE_GAP_EVENT_ADV_COMPLETE:
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE");
NRF_LOG_INFO("reason=%d; status=%0X", event->adv_complete.reason, event->connect.status);
- StartAdvertising();
+ if (bleController.IsRadioEnabled() && !bleController.IsConnected()) {
+ StartAdvertising();
+ }
break;
case BLE_GAP_EVENT_CONNECT:
@@ -219,9 +223,11 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
currentTimeClient.Reset();
alertNotificationClient.Reset();
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
- bleController.Disconnect();
- fastAdvCount = 0;
- StartAdvertising();
+ if(bleController.IsConnected()) {
+ bleController.Disconnect();
+ fastAdvCount = 0;
+ StartAdvertising();
+ }
break;
case BLE_GAP_EVENT_CONN_UPDATE:
@@ -396,6 +402,23 @@ void NimbleController::NotifyBatteryLevel(uint8_t level) {
}
}
+void NimbleController::EnableRadio() {
+ bleController.EnableRadio();
+ bleController.Disconnect();
+ fastAdvCount = 0;
+ StartAdvertising();
+}
+
+void NimbleController::DisableRadio() {
+ bleController.DisableRadio();
+ if (bleController.IsConnected()) {
+ ble_gap_terminate(connectionHandle, BLE_ERR_REM_USER_CONN_TERM);
+ bleController.Disconnect();
+ } else {
+ ble_gap_adv_stop();
+ }
+}
+
void NimbleController::PersistBond(struct ble_gap_conn_desc& desc) {
union ble_store_key key;
union ble_store_value our_sec, peer_sec, peer_cccd_set[MYNEWT_VAL(BLE_STORE_MAX_CCCDS)] = {0};