BatteryService
It is often a requirement for devices operating on battery to report the battery charge level to the user.
The Bluetooth Battery Service defines how to expose a battery charge level through a BLE link. It allows a client - usually a smartphone application - of a device to read the current battery charge level and follow its evolution.
The BatteryService class implements the Bluetooth Battery Service as defined by the Bluetooth SIG. Makers of BLE devices operating on battery can use the API to expose interoperably the charge level of their products.
BatteryService class reference
Public Member Functions | |
BatteryService (BLE &_ble, uint8_t level=100) | |
Instantiate a battery service. More... | |
void | updateBatteryLevel (uint8_t newLevel) |
Update the battery charge level that the service exposes. More... |
Protected Attributes | |
BLE & | ble |
Reference to the underlying BLE instance that this object is attached to. More... | |
uint8_t | batteryLevel |
The current battery level represented as an integer from 0% to 100%. More... | |
ReadOnlyGattCharacteristic< uint8_t > | batteryLevelCharacteristic |
The GATT characteristic, which exposes the charge level. More... |
BatteryService example
/* mbed Microcontroller Library
* Copyright (c) 2006-2014 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <events/mbed_events.h>
#include <mbed.h>
#include "ble/BLE.h"
#include "ble/Gap.h"
#include "ble/services/BatteryService.h"
#include "pretty_printer.h"
static DigitalOut led1(LED1, 1);
const static char DEVICE_NAME[] = "BATTERY";
static events::EventQueue event_queue(/* event count */ 16 * EVENTS_EVENT_SIZE);
class BatteryDemo : ble::Gap::EventHandler {
public:
BatteryDemo(BLE &ble, events::EventQueue &event_queue) :
_ble(ble),
_event_queue(event_queue),
_battery_uuid(GattService::UUID_BATTERY_SERVICE),
_battery_level(50),
_battery_service(ble, _battery_level),
_adv_data_builder(_adv_buffer) { }
void start() {
_ble.gap().setEventHandler(this);
_ble.init(this, &BatteryDemo::on_init_complete);
_event_queue.call_every(500, this, &BatteryDemo::blink);
_event_queue.call_every(1000, this, &BatteryDemo::update_sensor_value);
_event_queue.dispatch_forever();
}
private:
/** Callback triggered when the ble initialization process has finished */
void on_init_complete(BLE::InitializationCompleteCallbackContext *params) {
if (params->error != BLE_ERROR_NONE) {
print_error(params->error, "Ble initialization failed.");
return;
}
print_mac_address();
start_advertising();
}
void start_advertising() {
/* Create advertising parameters and payload */
ble::AdvertisingParameters adv_parameters(
ble::advertising_type_t::CONNECTABLE_UNDIRECTED,
ble::adv_interval_t(ble::millisecond_t(1000))
);
_adv_data_builder.setFlags();
_adv_data_builder.setLocalServiceList(mbed::make_Span(&_battery_uuid, 1));
_adv_data_builder.setName(DEVICE_NAME);
/* Setup advertising */
ble_error_t error = _ble.gap().setAdvertisingParameters(
ble::LEGACY_ADVERTISING_HANDLE,
adv_parameters
);
if (error) {
print_error(error, "_ble.gap().setAdvertisingParameters() failed");
return;
}
error = _ble.gap().setAdvertisingPayload(
ble::LEGACY_ADVERTISING_HANDLE,
_adv_data_builder.getAdvertisingData()
);
if (error) {
print_error(error, "_ble.gap().setAdvertisingPayload() failed");
return;
}
/* Start advertising */
error = _ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
if (error) {
print_error(error, "_ble.gap().startAdvertising() failed");
return;
}
}
void update_sensor_value() {
if (_ble.gap().getState().connected) {
_battery_level++;
if (_battery_level > 100) {
_battery_level = 20;
}
_battery_service.updateBatteryLevel(_battery_level);
}
}
void blink(void) {
led1 = !led1;
}
private:
/* Event handler */
void onDisconnectionComplete(const ble::DisconnectionCompleteEvent&) {
_ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
}
private:
BLE &_ble;
events::EventQueue &_event_queue;
UUID _battery_uuid;
uint8_t _battery_level;
BatteryService _battery_service;
uint8_t _adv_buffer[ble::LEGACY_ADVERTISING_MAX_SIZE];
ble::AdvertisingDataBuilder _adv_data_builder;
};
/** Schedule processing of events from the BLE middleware in the event queue. */
void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *context) {
event_queue.call(Callback<void()>(&context->ble, &BLE::processEvents));
}
int main()
{
BLE &ble = BLE::Instance();
ble.onEventsToProcess(schedule_ble_events);
BatteryDemo demo(ble, event_queue);
demo.start();
return 0;
}
Related content
- Bluetooth Battery Service specification.