summaryrefslogtreecommitdiff
path: root/src/components/ble
diff options
context:
space:
mode:
authorJames A. Jerkins <evergreen@jamesjerkinscomputer.com>2021-12-23 20:30:14 -0600
committerJames A. Jerkins <evergreen@jamesjerkinscomputer.com>2021-12-23 20:30:14 -0600
commit319030d9e16e833cf8bff569a9ecfa452165ea27 (patch)
treeae2890204710ac41fd7f637ac1c367c09f671009 /src/components/ble
parent3b0b48020d96353fc6cd114aa80fc2fec98363a3 (diff)
Add airplane mode feature
Implements 'Airplane mode' feature to disable and enable bluetooth/ble Adds airplaneMode as a non-persisted setting Adds a setting menu for switching airplane mode on and off Displays an airplane symbol on the Digital watch face and the PineTimeStyle watch face when airplane mode is enabled Always enables bluetooth/ble on boot (disable airplane mode) Alphabetizes the settings menu options Style cleanups Closes #632
Diffstat (limited to 'src/components/ble')
-rw-r--r--src/components/ble/BleController.cpp8
-rw-r--r--src/components/ble/BleController.h9
-rw-r--r--src/components/ble/NimbleController.cpp44
-rw-r--r--src/components/ble/NimbleController.h28
4 files changed, 57 insertions, 32 deletions
diff --git a/src/components/ble/BleController.cpp b/src/components/ble/BleController.cpp
index a80c9719..0e1c5d7e 100644
--- a/src/components/ble/BleController.cpp
+++ b/src/components/ble/BleController.cpp
@@ -2,12 +2,12 @@
using namespace Pinetime::Controllers;
-void Ble::Connect() {
- isConnected = true;
+void Ble::SetConnectState(Ble::ConnectStates newState) {
+ connectionState = newState;
}
-void Ble::Disconnect() {
- isConnected = false;
+Ble::ConnectStates Ble::GetConnectState() const {
+ return connectionState;
}
void Ble::StartFirmwareUpdate() {
diff --git a/src/components/ble/BleController.h b/src/components/ble/BleController.h
index 72b87663..2714c0c3 100644
--- a/src/components/ble/BleController.h
+++ b/src/components/ble/BleController.h
@@ -10,13 +10,14 @@ namespace Pinetime {
using BleAddress = std::array<uint8_t, 6>;
enum class FirmwareUpdateStates { Idle, Running, Validated, Error };
enum class AddressTypes { Public, Random, RPA_Public, RPA_Random };
+ enum class ConnectStates { Disconnected, Connected, Airplane };
Ble() = default;
bool IsConnected() const {
- return isConnected;
+ return (connectionState == ConnectStates::Connected);
}
- void Connect();
- void Disconnect();
+ void SetConnectState(ConnectStates newState);
+ ConnectStates GetConnectState() const;
void StartFirmwareUpdate();
void StopFirmwareUpdate();
@@ -56,7 +57,7 @@ namespace Pinetime {
}
private:
- bool isConnected = false;
+ ConnectStates connectionState = ConnectStates::Disconnected;
bool isFirmwareUpdating = false;
uint32_t firmwareUpdateTotalBytes = 0;
uint32_t firmwareUpdateCurrentBytes = 0;
diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp
index d8510bd3..d85ec5dc 100644
--- a/src/components/ble/NimbleController.cpp
+++ b/src/components/ble/NimbleController.cpp
@@ -23,14 +23,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},
@@ -184,7 +184,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.GetConnectState() == Ble::ConnectStates::Disconnected) {
+ StartAdvertising();
+ }
break;
case BLE_GAP_EVENT_CONNECT:
@@ -197,12 +199,12 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
currentTimeClient.Reset();
alertNotificationClient.Reset();
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
- bleController.Disconnect();
+ bleController.SetConnectState(Ble::ConnectStates::Disconnected);
fastAdvCount = 0;
StartAdvertising();
} else {
connectionHandle = event->connect.conn_handle;
- bleController.Connect();
+ bleController.SetConnectState(Ble::ConnectStates::Connected);
systemTask.PushMessage(Pinetime::System::Messages::BleConnected);
// Service discovery is deferred via systemtask
}
@@ -220,9 +222,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.GetConnectState() == Ble::ConnectStates::Connected) {
+ bleController.SetConnectState(Ble::ConnectStates::Disconnected);
+ fastAdvCount = 0;
+ StartAdvertising();
+ }
break;
case BLE_GAP_EVENT_CONN_UPDATE:
@@ -376,6 +380,22 @@ void NimbleController::NotifyBatteryLevel(uint8_t level) {
}
}
+void NimbleController::SwitchAirplaneMode(bool enabled) {
+ if (enabled) {
+ if (bleController.IsConnected()) {
+ bleController.SetConnectState(Ble::ConnectStates::Airplane);
+ ble_gap_terminate(connectionHandle, BLE_ERR_REM_USER_CONN_TERM);
+ } else {
+ bleController.SetConnectState(Ble::ConnectStates::Airplane);
+ ble_gap_adv_stop();
+ }
+ } else {
+ bleController.SetConnectState(Ble::ConnectStates::Disconnected);
+ fastAdvCount = 0;
+ StartAdvertising();
+ }
+}
+
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};
diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h
index 2b300e63..7219ba6b 100644
--- a/src/components/ble/NimbleController.h
+++ b/src/components/ble/NimbleController.h
@@ -14,6 +14,7 @@
#include "components/ble/CurrentTimeService.h"
#include "components/ble/DeviceInformationService.h"
#include "components/ble/DfuService.h"
+#include "components/ble/FSService.h"
#include "components/ble/HeartRateService.h"
#include "components/ble/ImmediateAlertService.h"
#include "components/ble/MusicService.h"
@@ -22,7 +23,6 @@
#include "components/ble/MotionService.h"
#include "components/ble/weather/WeatherService.h"
#include "components/fs/FS.h"
-#include "components/ble/FSService.h"
namespace Pinetime {
namespace Drivers {
@@ -42,18 +42,19 @@ namespace Pinetime {
public:
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,
- Pinetime::Controllers::FS& fs);
+ HeartRateController& heartRateController,
+ MotionController& motionController,
+ FS& fs);
void Init();
void StartAdvertising();
int OnGAPEvent(ble_gap_event* event);
+ /* these are not implemented yet
int OnDiscoveryEvent(uint16_t i, const ble_gatt_error* pError, const ble_gatt_svc* pSvc);
int OnCTSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic);
int OnANSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic);
@@ -62,6 +63,7 @@ namespace Pinetime {
const ble_gatt_error* error,
uint16_t characteristicValueHandle,
const ble_gatt_dsc* descriptor);
+ */
void StartDiscovery();
@@ -83,7 +85,9 @@ namespace Pinetime {
void RestartFastAdv() {
fastAdvCount = 0;
- }
+ };
+
+ void SwitchAirplaneMode(bool enabled);
private:
void PersistBond(struct ble_gap_conn_desc& desc);
@@ -91,12 +95,12 @@ namespace Pinetime {
static constexpr const char* deviceName = "InfiniTime";
Pinetime::System::SystemTask& systemTask;
- Pinetime::Controllers::Ble& bleController;
+ Ble& bleController;
DateTime& dateTimeController;
- Pinetime::Controllers::NotificationManager& notificationManager;
+ NotificationManager& notificationManager;
Pinetime::Drivers::SpiNorFlash& spiNorFlash;
- Pinetime::Controllers::FS& fs;
- Pinetime::Controllers::DfuService dfuService;
+ FS& fs;
+ DfuService dfuService;
DeviceInformationService deviceInformationService;
CurrentTimeClient currentTimeClient;