Skip to content

Commit c32ba84

Browse files
committed
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.
1 parent 3e1fe68 commit c32ba84

2 files changed

Lines changed: 6 additions & 0 deletions

File tree

src/components/ble/NimbleController.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ void NimbleController::StartAdvertising() {
122122

123123
adv_params.conn_mode = BLE_GAP_CONN_MODE_UND;
124124
adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
125+
adv_params.itvl_min = advInterval;
126+
adv_params.itvl_max = advInterval + 100;
125127

126128
fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
127129
fields.uuids128 = &dfuServiceUuid;
@@ -148,6 +150,8 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
148150
case BLE_GAP_EVENT_ADV_COMPLETE:
149151
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE");
150152
NRF_LOG_INFO("reason=%d; status=%d", event->adv_complete.reason, event->connect.status);
153+
if (advInterval < 7100)
154+
advInterval += 500;
151155
StartAdvertising();
152156
break;
153157

@@ -181,6 +185,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
181185
alertNotificationClient.Reset();
182186
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
183187
bleController.Disconnect();
188+
advInterval = 100;
184189
StartAdvertising();
185190
break;
186191

src/components/ble/NimbleController.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ namespace Pinetime {
9494

9595
uint8_t addrType; // 1 = Random, 0 = PUBLIC
9696
uint16_t connectionHandle = BLE_HS_CONN_HANDLE_NONE;
97+
uint16_t advInterval = 100; // multiplied by 0.625ms, must be in 32..16384
9798

9899
ble_uuid128_t dfuServiceUuid {
99100
.u {.type = BLE_UUID_TYPE_128},

0 commit comments

Comments
 (0)