aboutsummaryrefslogtreecommitdiffstats
path: root/examples/bluetooth/heartrate_game/connectionhandler.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/bluetooth/heartrate_game/connectionhandler.py')
-rw-r--r--examples/bluetooth/heartrate_game/connectionhandler.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/examples/bluetooth/heartrate_game/connectionhandler.py b/examples/bluetooth/heartrate_game/connectionhandler.py
new file mode 100644
index 000000000..7bf60bbc5
--- /dev/null
+++ b/examples/bluetooth/heartrate_game/connectionhandler.py
@@ -0,0 +1,77 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtBluetooth import QBluetoothLocalDevice
+from PySide6.QtQml import QmlElement
+from PySide6.QtCore import QObject, Property, Signal, Slot, Qt
+
+from heartrate_global import simulator, is_android, error_not_nuitka
+
+if is_android or sys.platform == "darwin":
+ from PySide6.QtCore import QBluetoothPermission
+
+# To be used on the @QmlElement decorator
+# (QML_IMPORT_MINOR_VERSION is optional)
+QML_IMPORT_NAME = "HeartRateGame"
+QML_IMPORT_MAJOR_VERSION = 1
+
+
+@QmlElement
+class ConnectionHandler(QObject):
+
+ deviceChanged = Signal()
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.m_hasPermission = False
+ self.initLocalDevice()
+
+ @Property(bool, notify=deviceChanged)
+ def alive(self):
+ if sys.platform == "darwin":
+ return True
+ if simulator():
+ return True
+ return (self.m_localDevice.isValid()
+ and self.m_localDevice.hostMode() != QBluetoothLocalDevice.HostPoweredOff)
+
+ @Property(bool, constant=True)
+ def requiresAddressType(self):
+ return sys.platform == "linux" # QT_CONFIG(bluez)?
+
+ @Property(str, notify=deviceChanged)
+ def name(self):
+ return self.m_localDevice.name()
+
+ @Property(str, notify=deviceChanged)
+ def address(self):
+ return self.m_localDevice.address().toString()
+
+ @Property(bool, notify=deviceChanged)
+ def hasPermission(self):
+ return self.m_hasPermission
+
+ @Slot(QBluetoothLocalDevice.HostMode)
+ def hostModeChanged(self, mode):
+ self.deviceChanged.emit()
+
+ def initLocalDevice(self):
+ if is_android or sys.platform == "darwin":
+ error_not_nuitka()
+ permission = QBluetoothPermission()
+ permission.setCommunicationModes(QBluetoothPermission.Access)
+ permission_status = qApp.checkPermission(permission) # noqa: F821
+ if permission_status == Qt.PermissionStatus.Undetermined:
+ qApp.requestPermission(permission, self, self.initLocalDevice) # noqa: F821
+ return
+ if permission_status == Qt.PermissionStatus.Denied:
+ return
+ elif permission_status == Qt.PermissionStatus.Granted:
+ print("[HeartRateGame] Bluetooth Permission Granted")
+
+ self.m_localDevice = QBluetoothLocalDevice()
+ self.m_localDevice.hostModeStateChanged.connect(self.hostModeChanged)
+ self.m_hasPermission = True
+ self.deviceChanged.emit()