BLE Pairing fix (#9701)
* BLE Pairing fix * gating for consistency --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
co-authored by
Ben Meadors
parent
6bc3e31537
commit
8f81b194d3
@@ -875,6 +875,10 @@ int32_t Screen::runOnce()
|
|||||||
break;
|
break;
|
||||||
case Cmd::STOP_ALERT_FRAME:
|
case Cmd::STOP_ALERT_FRAME:
|
||||||
NotificationRenderer::pauseBanner = false;
|
NotificationRenderer::pauseBanner = false;
|
||||||
|
// Return from one-off alert mode back to regular frames.
|
||||||
|
if (!showingNormalScreen && NotificationRenderer::current_notification_type != notificationTypeEnum::text_input) {
|
||||||
|
setFrames();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Cmd::STOP_BOOT_SCREEN:
|
case Cmd::STOP_BOOT_SCREEN:
|
||||||
EINK_ADD_FRAMEFLAG(dispdev, COSMETIC); // E-Ink: Explicitly use full-refresh for next frame
|
EINK_ADD_FRAMEFLAG(dispdev, COSMETIC); // E-Ink: Explicitly use full-refresh for next frame
|
||||||
|
|||||||
@@ -52,6 +52,20 @@ NimBLEServer *bleServer;
|
|||||||
static bool passkeyShowing;
|
static bool passkeyShowing;
|
||||||
static std::atomic<uint16_t> nimbleBluetoothConnHandle{BLE_HS_CONN_HANDLE_NONE}; // BLE_HS_CONN_HANDLE_NONE means "no connection"
|
static std::atomic<uint16_t> nimbleBluetoothConnHandle{BLE_HS_CONN_HANDLE_NONE}; // BLE_HS_CONN_HANDLE_NONE means "no connection"
|
||||||
|
|
||||||
|
static void clearPairingDisplay()
|
||||||
|
{
|
||||||
|
if (!passkeyShowing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
passkeyShowing = false;
|
||||||
|
#if HAS_SCREEN
|
||||||
|
if (screen) {
|
||||||
|
screen->endAlert();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread
|
class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -630,13 +644,7 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks
|
|||||||
|
|
||||||
meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::CONNECTED);
|
meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::CONNECTED);
|
||||||
bluetoothStatus->updateStatus(&newStatus);
|
bluetoothStatus->updateStatus(&newStatus);
|
||||||
|
clearPairingDisplay();
|
||||||
// Todo: migrate this display code back into Screen class, and observe bluetoothStatus
|
|
||||||
if (passkeyShowing) {
|
|
||||||
passkeyShowing = false;
|
|
||||||
if (screen)
|
|
||||||
screen->endAlert();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store the connection handle for future use
|
// Store the connection handle for future use
|
||||||
#ifdef NIMBLE_TWO
|
#ifdef NIMBLE_TWO
|
||||||
@@ -693,6 +701,7 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks
|
|||||||
|
|
||||||
meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::DISCONNECTED);
|
meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::DISCONNECTED);
|
||||||
bluetoothStatus->updateStatus(&newStatus);
|
bluetoothStatus->updateStatus(&newStatus);
|
||||||
|
clearPairingDisplay();
|
||||||
|
|
||||||
if (bluetoothPhoneAPI) {
|
if (bluetoothPhoneAPI) {
|
||||||
bluetoothPhoneAPI->close();
|
bluetoothPhoneAPI->close();
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ static uint8_t toRadioBytes[meshtastic_ToRadio_size];
|
|||||||
static uint8_t lastToRadio[MAX_TO_FROM_RADIO_SIZE];
|
static uint8_t lastToRadio[MAX_TO_FROM_RADIO_SIZE];
|
||||||
|
|
||||||
static uint16_t connectionHandle;
|
static uint16_t connectionHandle;
|
||||||
|
static bool passkeyShowing;
|
||||||
|
|
||||||
class BluetoothPhoneAPI : public PhoneAPI
|
class BluetoothPhoneAPI : public PhoneAPI
|
||||||
{
|
{
|
||||||
@@ -86,6 +87,16 @@ void onDisconnect(uint16_t conn_handle, uint8_t reason)
|
|||||||
// Notify UI (or any other interested firmware components)
|
// Notify UI (or any other interested firmware components)
|
||||||
meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::DISCONNECTED);
|
meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::DISCONNECTED);
|
||||||
bluetoothStatus->updateStatus(&newStatus);
|
bluetoothStatus->updateStatus(&newStatus);
|
||||||
|
|
||||||
|
#if HAS_SCREEN
|
||||||
|
// If a pairing prompt is active, make sure we dismiss it on disconnect/cancel/failure paths.
|
||||||
|
if (passkeyShowing) {
|
||||||
|
passkeyShowing = false;
|
||||||
|
if (screen) {
|
||||||
|
screen->endAlert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
|
void onCccd(uint16_t conn_hdl, BLECharacteristic *chr, uint16_t cccd_value)
|
||||||
{
|
{
|
||||||
@@ -400,6 +411,8 @@ bool NRF52Bluetooth::onPairingPasskey(uint16_t conn_handle, uint8_t const passke
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
passkeyShowing = true;
|
||||||
|
|
||||||
if (match_request) {
|
if (match_request) {
|
||||||
uint32_t start_time = millis();
|
uint32_t start_time = millis();
|
||||||
while (millis() < start_time + 30000) {
|
while (millis() < start_time + 30000) {
|
||||||
@@ -451,6 +464,7 @@ void NRF52Bluetooth::onPairingCompleted(uint16_t conn_handle, uint8_t auth_statu
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Todo: migrate this display code back into Screen class, and observe bluetoothStatus
|
// Todo: migrate this display code back into Screen class, and observe bluetoothStatus
|
||||||
|
passkeyShowing = false;
|
||||||
if (screen) {
|
if (screen) {
|
||||||
screen->endAlert();
|
screen->endAlert();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user