diff options
Diffstat (limited to 'examples/bluetooth/heartrate_game/connectionhandler.py')
-rw-r--r-- | examples/bluetooth/heartrate_game/connectionhandler.py | 77 |
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() |