summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
authorJames A. Jerkins <evergreen@jamesjerkinscomputer.com>2021-09-04 15:26:50 -0500
committerJames A. Jerkins <evergreen@jamesjerkinscomputer.com>2021-09-04 15:57:07 -0500
commitc32ba844e04017a3fd31444c384deb3542bd76be (patch)
tree7ccbdfe108dd1b0b7df146606b06fa3c3149474e /src/components
parent3e1fe687b82d4df237b7b355fa31cb88713193fc (diff)
Linear decrease of advert rate to conserve battery
Start advertising aggressively when powered on then slow down linearly over 75 seconds. This will conserve battery by not advertising rapidly the whole time we are seeking a connection. The slowest rate is approximately once every 4.5 seconds to balance responsiveness and battery life. We use a fixed advertising duration of 5 seconds and start with a 62.5 ms advertising interval. Every 5 seconds (the advertising duration) we step up to a larger advertising interval (slower advertising). We continue to increase the advertising interval linearly for 75 seconds from the start of advertising. At 75 seconds we have an advertising interval of 4.44 seconds which we keep until connected. A reboot will restart the sequence. When we receive a disconnect event we restart the sequence with fast advertising and then slow down as described above. Note that we are not using the BLE high duty cycle setting to change the advertising rate. The rate is managed by repeatedly setting the minimum and maximum intervals. The linear rate of decrease and the slowest interval size were determined experimentally by the author. The 5.3 Core spec suggests that you not advertise slower than once every 1.2 seconds to preserve responsiveness but we ignored that suggestion.
Diffstat (limited to 'src/components')
-rw-r--r--src/components/ble/NimbleController.cpp5
-rw-r--r--src/components/ble/NimbleController.h1
2 files changed, 6 insertions, 0 deletions
diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp
index 8e0fe756..bebca2d3 100644
--- a/src/components/ble/NimbleController.cpp
+++ b/src/components/ble/NimbleController.cpp
@@ -122,6 +122,8 @@ void NimbleController::StartAdvertising() {
adv_params.conn_mode = BLE_GAP_CONN_MODE_UND;
adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
+ adv_params.itvl_min = advInterval;
+ adv_params.itvl_max = advInterval + 100;
fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
fields.uuids128 = &dfuServiceUuid;
@@ -148,6 +150,8 @@ 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=%d", event->adv_complete.reason, event->connect.status);
+ if (advInterval < 7100)
+ advInterval += 500;
StartAdvertising();
break;
@@ -181,6 +185,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
alertNotificationClient.Reset();
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
bleController.Disconnect();
+ advInterval = 100;
StartAdvertising();
break;
diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h
index 078d6158..79761108 100644
--- a/src/components/ble/NimbleController.h
+++ b/src/components/ble/NimbleController.h
@@ -94,6 +94,7 @@ namespace Pinetime {
uint8_t addrType; // 1 = Random, 0 = PUBLIC
uint16_t connectionHandle = BLE_HS_CONN_HANDLE_NONE;
+ uint16_t advInterval = 100; // multiplied by 0.625ms, must be in 32..16384
ble_uuid128_t dfuServiceUuid {
.u {.type = BLE_UUID_TYPE_128},