diff options
| author | Michele Bini <michele.bini@gmail.com> | 2022-04-10 11:00:50 (GMT) |
|---|---|---|
| committer | Michele Bini <michele.bini@gmail.com> | 2022-04-10 11:19:45 (GMT) |
| commit | 4f46da35b4a1b0a708594cb91343b921928d6a01 (patch) | |
| tree | 91d20252a8ff11648f9449cebaa29702ce0a6438 | |
| parent | 9f68f5b227ad3c83130d7cc521c80b6caf974466 (diff) | |
Bluetooth Passkey Toggle setting
| -rw-r--r-- | src/components/ble/BleController.h | 4 | ||||
| -rw-r--r-- | src/components/ble/NimbleController.cpp | 47 | ||||
| -rw-r--r-- | src/components/settings/Settings.h | 11 | ||||
| -rw-r--r-- | src/displayapp/DisplayApp.cpp | 3 | ||||
| -rw-r--r-- | src/displayapp/Messages.h | 3 | ||||
| -rw-r--r-- | src/displayapp/screens/settings/SettingBluetooth.cpp | 36 | ||||
| -rw-r--r-- | src/displayapp/screens/settings/SettingBluetooth.h | 4 | ||||
| -rw-r--r-- | src/systemtask/Messages.h | 3 | ||||
| -rw-r--r-- | src/systemtask/SystemTask.cpp | 15 |
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; } |
