mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-19 03:22:07 +00:00

Some checks are pending
CI / setup (check) (push) Waiting to run
CI / setup (esp32) (push) Waiting to run
CI / setup (esp32c3) (push) Waiting to run
CI / setup (esp32c6) (push) Waiting to run
CI / setup (esp32s3) (push) Waiting to run
CI / setup (nrf52840) (push) Waiting to run
CI / setup (rp2040) (push) Waiting to run
CI / setup (stm32) (push) Waiting to run
CI / check (push) Blocked by required conditions
CI / build-esp32 (push) Blocked by required conditions
CI / build-esp32-s3 (push) Blocked by required conditions
CI / build-esp32-c3 (push) Blocked by required conditions
CI / build-esp32-c6 (push) Blocked by required conditions
CI / build-nrf52 (push) Blocked by required conditions
CI / build-rpi2040 (push) Blocked by required conditions
CI / build-stm32 (push) Blocked by required conditions
CI / build-debian-src (push) Waiting to run
CI / package-pio-deps-native-tft (push) Waiting to run
CI / test-native (push) Waiting to run
CI / docker-deb-amd64 (push) Waiting to run
CI / docker-deb-amd64-tft (push) Waiting to run
CI / docker-alp-amd64 (push) Waiting to run
CI / docker-alp-amd64-tft (push) Waiting to run
CI / docker-deb-arm64 (push) Waiting to run
CI / docker-deb-armv7 (push) Waiting to run
CI / gather-artifacts (esp32) (push) Blocked by required conditions
CI / gather-artifacts (esp32c3) (push) Blocked by required conditions
CI / gather-artifacts (esp32c6) (push) Blocked by required conditions
CI / gather-artifacts (esp32s3) (push) Blocked by required conditions
CI / gather-artifacts (nrf52840) (push) Blocked by required conditions
CI / gather-artifacts (rp2040) (push) Blocked by required conditions
CI / gather-artifacts (stm32) (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
CI / release-firmware (esp32) (push) Blocked by required conditions
CI / release-firmware (esp32c3) (push) Blocked by required conditions
CI / release-firmware (esp32c6) (push) Blocked by required conditions
CI / release-firmware (esp32s3) (push) Blocked by required conditions
CI / release-firmware (nrf52840) (push) Blocked by required conditions
CI / release-firmware (rp2040) (push) Blocked by required conditions
CI / release-firmware (stm32) (push) Blocked by required conditions
CI / publish-firmware (push) Blocked by required conditions
* Use BLE_LED where present for CONNECTED/DISCONNECTED * Use WIFI_LED where present for WiFi started/stopped (as AP) or connected/disconnected (as Station) * improve support for Heltec Wireless Bridge * satisfy 'trunk fmt'
112 lines
3.3 KiB
C++
112 lines
3.3 KiB
C++
#pragma once
|
|
#include "Status.h"
|
|
#include "assert.h"
|
|
#include "configuration.h"
|
|
#include "meshUtils.h"
|
|
#include <Arduino.h>
|
|
|
|
namespace meshtastic
|
|
{
|
|
|
|
// Describes the state of the Bluetooth connection
|
|
// Allows display to handle pairing events without each UI needing to explicitly hook the Bluefruit / NimBLE code
|
|
class BluetoothStatus : public Status
|
|
{
|
|
public:
|
|
enum class ConnectionState {
|
|
DISCONNECTED,
|
|
PAIRING,
|
|
CONNECTED,
|
|
};
|
|
|
|
private:
|
|
CallbackObserver<BluetoothStatus, const BluetoothStatus *> statusObserver =
|
|
CallbackObserver<BluetoothStatus, const BluetoothStatus *>(this, &BluetoothStatus::updateStatus);
|
|
|
|
ConnectionState state = ConnectionState::DISCONNECTED;
|
|
std::string passkey; // Stored as string, because Bluefruit allows passkeys with a leading zero
|
|
|
|
public:
|
|
BluetoothStatus() { statusType = STATUS_TYPE_BLUETOOTH; }
|
|
|
|
// New BluetoothStatus: connected or disconnected
|
|
explicit BluetoothStatus(ConnectionState state)
|
|
{
|
|
assert(state != ConnectionState::PAIRING); // If pairing, use constructor which specifies passkey
|
|
statusType = STATUS_TYPE_BLUETOOTH;
|
|
this->state = state;
|
|
}
|
|
|
|
// New BluetoothStatus: pairing, with passkey
|
|
explicit BluetoothStatus(const std::string &passkey) : Status()
|
|
{
|
|
statusType = STATUS_TYPE_BLUETOOTH;
|
|
this->state = ConnectionState::PAIRING;
|
|
this->passkey = passkey;
|
|
}
|
|
|
|
ConnectionState getConnectionState() const { return this->state; }
|
|
|
|
std::string getPasskey() const
|
|
{
|
|
assert(state == ConnectionState::PAIRING);
|
|
return this->passkey;
|
|
}
|
|
|
|
void observe(Observable<const BluetoothStatus *> *source) { statusObserver.observe(source); }
|
|
|
|
bool matches(const BluetoothStatus *newStatus) const
|
|
{
|
|
if (this->state == newStatus->getConnectionState()) {
|
|
// Same state: CONNECTED / DISCONNECTED
|
|
if (this->state != ConnectionState::PAIRING)
|
|
return true;
|
|
// Same state: PAIRING, and passkey matches
|
|
else if (this->getPasskey() == newStatus->getPasskey())
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
int updateStatus(const BluetoothStatus *newStatus)
|
|
{
|
|
// Has the status changed?
|
|
if (!matches(newStatus)) {
|
|
// Copy the members
|
|
state = newStatus->getConnectionState();
|
|
if (state == ConnectionState::PAIRING)
|
|
passkey = newStatus->getPasskey();
|
|
|
|
// Tell anyone interested that we have an update
|
|
onNewStatus.notifyObservers(this);
|
|
|
|
// Debug only:
|
|
switch (state) {
|
|
case ConnectionState::PAIRING:
|
|
LOG_DEBUG("BluetoothStatus PAIRING, key=%s", passkey.c_str());
|
|
break;
|
|
case ConnectionState::CONNECTED:
|
|
LOG_DEBUG("BluetoothStatus CONNECTED");
|
|
#ifdef BLE_LED
|
|
digitalWrite(BLE_LED, HIGH);
|
|
#endif
|
|
break;
|
|
|
|
case ConnectionState::DISCONNECTED:
|
|
LOG_DEBUG("BluetoothStatus DISCONNECTED");
|
|
#ifdef BLE_LED
|
|
digitalWrite(BLE_LED, LOW);
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
} // namespace meshtastic
|
|
|
|
extern meshtastic::BluetoothStatus *bluetoothStatus;
|