summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichele Bini <michele.bini@gmail.com>2022-04-10 11:00:50 (GMT)
committerMichele Bini <michele.bini@gmail.com>2022-04-10 11:19:45 (GMT)
commit4f46da35b4a1b0a708594cb91343b921928d6a01 (patch)
tree91d20252a8ff11648f9449cebaa29702ce0a6438
parent9f68f5b227ad3c83130d7cc521c80b6caf974466 (diff)
Bluetooth Passkey Toggle setting
-rw-r--r--src/components/ble/BleController.h4
-rw-r--r--src/components/ble/NimbleController.cpp47
-rw-r--r--src/components/settings/Settings.h11
-rw-r--r--src/displayapp/DisplayApp.cpp3
-rw-r--r--src/displayapp/Messages.h3
-rw-r--r--src/displayapp/screens/settings/SettingBluetooth.cpp36
-rw-r--r--src/displayapp/screens/settings/SettingBluetooth.h4
-rw-r--r--src/systemtask/Messages.h3
-rw-r--r--src/systemtask/SystemTask.cpp15
9 files changed, 95 insertions, 31 deletions
diff --git a/src/components/ble/BleController.h b/src/components/ble/BleController.h
index 675ede2..594cf40 100644
--- a/src/components/ble/BleController.h
+++ b/src/components/ble/BleController.h
@@ -20,6 +20,9 @@ namespace Pinetime {
void EnableRadio();
void DisableRadio();
+ void EnablePasskey() { isPasskeyEnabled = true; }
+ void DisablePasskey() { isPasskeyEnabled = false; }
+
void StartFirmwareUpdate();
void StopFirmwareUpdate();
void FirmwareUpdateTotalBytes(uint32_t totalBytes);
@@ -60,6 +63,7 @@ namespace Pinetime {
private:
bool isConnected = false;
bool isRadioEnabled = true;
+ bool isPasskeyEnabled = false;
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 10eb429..a66551e 100644
--- a/src/components/ble/NimbleController.cpp
+++ b/src/components/ble/NimbleController.cpp
@@ -116,25 +116,38 @@ void NimbleController::Init() {
ASSERT(rc == 0);
bleController.Address(std::move(address));
- switch (addrType) {
- case BLE_OWN_ADDR_PUBLIC:
- bleController.AddressType(Ble::AddressTypes::Public);
- break;
- case BLE_OWN_ADDR_RANDOM:
- bleController.AddressType(Ble::AddressTypes::Random);
- break;
- case BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT:
- bleController.AddressType(Ble::AddressTypes::RPA_Public);
- break;
- case BLE_OWN_ADDR_RPA_RANDOM_DEFAULT:
- bleController.AddressType(Ble::AddressTypes::RPA_Random);
- break;
+ if (bleController.isPasskeyEnabled) {
+ switch (addrType) {
+ case BLE_OWN_ADDR_PUBLIC:
+ bleController.AddressType(Ble::AddressTypes::Public);
+ break;
+ case BLE_OWN_ADDR_RANDOM:
+ bleController.AddressType(Ble::AddressTypes::Random);
+ break;
+ case BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT:
+ bleController.AddressType(Ble::AddressTypes::RPA_Public);
+ break;
+ case BLE_OWN_ADDR_RPA_RANDOM_DEFAULT:
+ bleController.AddressType(Ble::AddressTypes::RPA_Random);
+ break;
+ }
+ } else {
+ switch (addrType) {
+ case BLE_OWN_ADDR_PUBLIC:
+ bleController.AddressType(Ble::AddressTypes::Public);
+ break;
+ default:
+ bleController.AddressType(Ble::AddressTypes::Random);
+ break;
+ }
}
rc = ble_gatts_start();
ASSERT(rc == 0);
- RestoreBond();
+ if (bleController.isPasskeyEnabled) {
+ RestoreBond();
+ }
StartAdvertising();
}
@@ -217,7 +230,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
NRF_LOG_INFO("Disconnect event : BLE_GAP_EVENT_DISCONNECT");
NRF_LOG_INFO("disconnect reason=%d", event->disconnect.reason);
- if (event->disconnect.conn.sec_state.bonded) {
+ if (bleController.isPasskeyEnabled && event->disconnect.conn.sec_state.bonded) {
PersistBond(event->disconnect.conn);
}
@@ -252,7 +265,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
NRF_LOG_INFO("Security event : BLE_GAP_EVENT_ENC_CHANGE");
NRF_LOG_INFO("encryption change event; status=%0X ", event->enc_change.status);
- if (event->enc_change.status == 0) {
+ if (bleController.isPasskeyEnabled && event->enc_change.status == 0) {
struct ble_gap_conn_desc desc;
ble_gap_conn_find(event->enc_change.conn_handle, &desc);
if (desc.sec_state.bonded) {
@@ -281,7 +294,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
* Use the tinycrypt prng here since rand() is predictable.
*/
NRF_LOG_INFO("Security event : BLE_GAP_EVENT_PASSKEY_ACTION");
- if (event->passkey.params.action == BLE_SM_IOACT_DISP) {
+ if (bleController.isPasskeyEnabled && event->passkey.params.action == BLE_SM_IOACT_DISP) {
struct ble_sm_io pkey = {0};
pkey.action = event->passkey.params.action;
diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h
index 34e1af4..2d5f1d5 100644
--- a/src/components/settings/Settings.h
+++ b/src/components/settings/Settings.h
@@ -211,10 +211,18 @@ namespace Pinetime {
return bleRadioEnabled;
};
+ void SetBluetoothPasskeyEnabled(bool enabled) {
+ settings.bluetoothPasskeyEnabled = enabled;
+ };
+
+ bool GetBluetoothPasskeyEnabled() const {
+ return settings.bluetoothPasskeyEnabled;
+ };
+
private:
Pinetime::Controllers::FS& fs;
- static constexpr uint32_t settingsVersion = 0x0003;
+ static constexpr uint32_t settingsVersion = 0x3505;
struct SettingsData {
uint32_t version = settingsVersion;
uint32_t stepsGoal = 10000;
@@ -232,6 +240,7 @@ namespace Pinetime {
uint16_t shakeWakeThreshold = 150;
Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
+ bool bluetoothPasskeyEnabled = false;
};
SettingsData settings;
diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index 9ce29da..75c7bbd 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -296,6 +296,9 @@ void DisplayApp::Refresh() {
case Messages::BleRadioEnableToggle:
PushMessageToSystemTask(System::Messages::BleRadioEnableToggle);
break;
+ case Messages::BluetoothPasskeyEnableToggle:
+ PushMessageToSystemTask(System::Messages::BluetoothPasskeyEnableToggle);
+ break;
case Messages::UpdateDateTime:
// Added to remove warning
// What should happen here?
diff --git a/src/displayapp/Messages.h b/src/displayapp/Messages.h
index 58df455..72ee718 100644
--- a/src/displayapp/Messages.h
+++ b/src/displayapp/Messages.h
@@ -22,7 +22,8 @@ namespace Pinetime {
ShowPairingKey,
AlarmTriggered,
Clock,
- BleRadioEnableToggle
+ BleRadioEnableToggle,
+ BluetoothPasskeyEnableToggle
};
}
}
diff --git a/src/displayapp/screens/settings/SettingBluetooth.cpp b/src/displayapp/screens/settings/SettingBluetooth.cpp
index ab1af22..ed7fbee 100644
--- a/src/displayapp/screens/settings/SettingBluetooth.cpp
+++ b/src/displayapp/screens/settings/SettingBluetooth.cpp
@@ -18,6 +18,11 @@ namespace {
auto* screen = static_cast<SettingBluetooth*>(obj->user_data);
screen->OnBluetoothEnabled(obj, event);
}
+
+ static void OnBluetoothPasskeyEnableToggleEvent(lv_obj_t* obj, lv_event_t event) {
+ auto* screen = static_cast<SettingBluetooth*>(obj->user_data);
+ screen->OnBluetoothPasskeyEnableToggle(obj, event);
+ }
}
SettingBluetooth::SettingBluetooth(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
@@ -46,17 +51,23 @@ SettingBluetooth::SettingBluetooth(Pinetime::Applications::DisplayApp* app, Pine
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
+ cbDisabled = lv_checkbox_create(container1, nullptr);
+ lv_checkbox_set_text(cbDisabled, " Disabled");
+ cbDisabled->user_data = this;
+ lv_obj_set_event_cb(cbDisabled, OnBluetoothDisabledEvent);
+ SetRadioButtonStyle(cbDisabled);
+
cbEnabled = lv_checkbox_create(container1, nullptr);
lv_checkbox_set_text(cbEnabled, " Enabled");
cbEnabled->user_data = this;
lv_obj_set_event_cb(cbEnabled, OnBluetoothEnabledEvent);
SetRadioButtonStyle(cbEnabled);
- cbDisabled = lv_checkbox_create(container1, nullptr);
- lv_checkbox_set_text(cbDisabled, " Disabled");
- cbDisabled->user_data = this;
- lv_obj_set_event_cb(cbDisabled, OnBluetoothDisabledEvent);
- SetRadioButtonStyle(cbDisabled);
+ cbPasskey = lv_checkbox_create(container1, nullptr);
+ lv_checkbox_set_text(cbPasskey, " Passkey");
+ cbPasskey->user_data = this;
+ lv_obj_set_event_cb(cbPasskey, OnBluetoothPasskeyEnableToggleEvent);
+ lv_checkbox_set_checked(cbPasskey, settingsController.GetBluetoothPasskeyEnabled());
if (settingsController.GetBleRadioEnabled()) {
lv_checkbox_set_checked(cbEnabled, true);
@@ -69,10 +80,6 @@ SettingBluetooth::SettingBluetooth(Pinetime::Applications::DisplayApp* app, Pine
SettingBluetooth::~SettingBluetooth() {
lv_obj_clean(lv_scr_act());
- // Do not call SaveSettings - see src/components/settings/Settings.h
- if (priorMode != settingsController.GetBleRadioEnabled()) {
- app->PushMessage(Pinetime::Applications::Display::Messages::BleRadioEnableToggle);
- }
}
void SettingBluetooth::OnBluetoothDisabled(lv_obj_t* object, lv_event_t event) {
@@ -80,6 +87,7 @@ void SettingBluetooth::OnBluetoothDisabled(lv_obj_t* object, lv_event_t event) {
lv_checkbox_set_checked(cbEnabled, false);
lv_checkbox_set_checked(cbDisabled, true);
settingsController.SetBleRadioEnabled(false);
+ app->PushMessage(Pinetime::Applications::Display::Messages::BleRadioEnableToggle);
}
}
@@ -88,6 +96,16 @@ void SettingBluetooth::OnBluetoothEnabled(lv_obj_t* object, lv_event_t event) {
lv_checkbox_set_checked(cbEnabled, true);
lv_checkbox_set_checked(cbDisabled, false);
settingsController.SetBleRadioEnabled(true);
+ app->PushMessage(Pinetime::Applications::Display::Messages::BleRadioEnableToggle);
+ }
+}
+
+void SettingBluetooth::OnBluetoothPasskeyEnableToggle(lv_obj_t* object, lv_event_t event) {
+ if (event == LV_EVENT_VALUE_CHANGED) {
+ bool enabled = !settingsController.GetBluetoothPasskeyEnabled();
+ settingsController.SetBluetoothPasskeyEnabled(enabled);
+ app->PushMessage(Pinetime::Applications::Display::Messages::BluetoothPasskeyEnableToggle);
+ lv_checkbox_set_checked(cbPasskey, enabled);
}
}
diff --git a/src/displayapp/screens/settings/SettingBluetooth.h b/src/displayapp/screens/settings/SettingBluetooth.h
index 12bb459..63cdd39 100644
--- a/src/displayapp/screens/settings/SettingBluetooth.h
+++ b/src/displayapp/screens/settings/SettingBluetooth.h
@@ -19,11 +19,13 @@ namespace Pinetime {
void OnBluetoothEnabled(lv_obj_t* object, lv_event_t event);
void OnBluetoothDisabled(lv_obj_t* object, lv_event_t event);
+ void OnBluetoothPasskeyEnableToggle(lv_obj_t* object, lv_event_t event);
private:
Controllers::Settings& settingsController;
- lv_obj_t* cbEnabled;
lv_obj_t* cbDisabled;
+ lv_obj_t* cbEnabled;
+ lv_obj_t* cbPasskey;
bool priorMode;
};
}
diff --git a/src/systemtask/Messages.h b/src/systemtask/Messages.h
index 2e3456a..d5759d2 100644
--- a/src/systemtask/Messages.h
+++ b/src/systemtask/Messages.h
@@ -31,7 +31,8 @@ namespace Pinetime {
BatteryPercentageUpdated,
StartFileTransfer,
StopFileTransfer,
- BleRadioEnableToggle
+ BleRadioEnableToggle,
+ BluetoothPasskeyEnableToggle
};
}
}
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 20ff937..4d803cd 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -134,7 +134,14 @@ void SystemTask::Work() {
fs.Init();
+ settingsController.Init();
+ if(settingsController.GetBluetoothPasskeyEnabled()) {
+ bleController.EnablePasskey();
+ } else {
+ bleController.DisablePasskey();
+ }
nimbleController.Init();
+
lcd.Init();
twiMaster.Init();
@@ -161,7 +168,6 @@ void SystemTask::Work() {
motionSensor.Init();
motionController.Init(motionSensor.DeviceType());
- settingsController.Init();
displayApp.Register(this);
displayApp.Start(bootError);
@@ -447,6 +453,13 @@ void SystemTask::Work() {
nimbleController.DisableRadio();
}
break;
+ case Messages::BluetoothPasskeyEnableToggle:
+ if(settingsController.GetBluetoothPasskeyEnabled()) {
+ bleController.EnablePasskey();
+ } else {
+ bleController.DisablePasskey();
+ }
+ break;
default:
break;
}