added connect page

This commit is contained in:
Dorian Zedler 2020-10-11 15:50:13 +02:00
parent 2ea5f20f62
commit fb1aeaf67c
Signed by: dorian
GPG key ID: D3B255CB8BC7CD37
15 changed files with 474 additions and 75 deletions

View file

@ -16,7 +16,9 @@ SOURCES += \
HEADERS += \
omobidisplaybackend.h
RESOURCES += qml.qrc
RESOURCES += \
ressources/qml/qml.qrc \
ressources/shared/shared.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
@ -31,3 +33,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
CONFIG += QBluetoothLeUart_QML
include($$PWD/QBluetoothLeUart/QBluetoothLeUart.pri)
DISTFILES += \
test.qmodel
STATECHARTS += \
testChart.scxml

@ -1 +1 @@
Subproject commit 049951ebed550535f7666fa849405ee835fc7e81
Subproject commit 60d10f056b53b1816bd97559ad2d7527bbc158a8

View file

@ -1,5 +1,6 @@
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickStyle>
#include <qbluetoothleuart.h>
#include "omobidisplaybackend.h"
@ -13,6 +14,8 @@ int main(int argc, char *argv[])
qmlRegisterType<OmobiDisplayBackend>("de.itsblue.omobidisplayapp", 1, 0, "OmobiDisplayBackend");
QBluetoothLeUart::init();
QQuickStyle::setStyle("Material");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,

View file

@ -1,54 +0,0 @@
import QtQuick 2.12
import QtQuick.Controls 2.0
import QtQuick.Window 2.12
import de.itsblue.omobidisplayapp 1.0
import de.itsblue.bluetoothleuart 1.0
ApplicationWindow {
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Page {
id: app
anchors.fill: parent
OmobiDisplayBackend {
id: backend
}
Button {
id: connectButton
text: "Scan for devices"
visible: backend.bleController.state === QBluetoothLeUART.Idle
onClicked: {
backend.bleController.startScanningForDevices()
}
}
ListView {
id: list
anchors.top: connectButton.bottom
anchors.margins: 10
height: parent.height
model: backend.bleController.avaliableDevices.length
delegate: Button {
property var thisDevice: backend.bleController.avaliableDevices[index]
text: thisDevice["name"]
onClicked: {
backend.bleController.connectToDevice(thisDevice["id"])
}
}
}
}
}

View file

@ -2,13 +2,15 @@
OmobiDisplayBackend::OmobiDisplayBackend(QObject *parent) : QObject(parent)
{
this->ble = new QBluetoothLeUart();
connect(this->ble, &QBluetoothLeUart::stateChanged, this, &OmobiDisplayBackend::handleBluetoothStateChange);
connect(this->ble, &QBluetoothLeUart::foundNewDevice, this, &OmobiDisplayBackend::handleFoundNewDevice);
connect(this->ble, &QBluetoothLeUart::dataReceived, this, &OmobiDisplayBackend::DataHandler);
connect(this->ble, &QBluetoothLeUart::connectedToDevice, this, &OmobiDisplayBackend::handleBluetoothDeviceConected);
this->setState(Idle);
this->ble->startScanningForDevices();
}
@ -17,24 +19,36 @@ void OmobiDisplayBackend::startScanning() {
}
void OmobiDisplayBackend::handleBluetoothStateChange(QBluetoothLeUart::BluetoothLeUartState state){
qDebug() << state;
switch(state){
case QBluetoothLeUart::AcquireData:
{
qDebug() << "Now acquiring data!";
/* Initialise Slot DataHandler(QString) - gets new data */
this->ble->sendData("Hat geklappt");
break;
}
default:
//nothing for now
case QBluetoothLeUart::Idle: {
this->setState(Idle);
break;
}
case QBluetoothLeUart::Scanning: {
this->setState(Scanning);
break;
}
case QBluetoothLeUart::ScanFinished: {
this->setState(ReadyToConnect);
break;
}
case QBluetoothLeUart::Connecting: {
this->setState(Connecting);
break;
}
case QBluetoothLeUart::ScanningForService: {
this->setState(Connecting);
break;
}
case QBluetoothLeUart::ServiceFound: {
this->setState(Connecting);
break;
}
case QBluetoothLeUart::Connected:
{
this->setState(Connected);
break;
}
}
}
@ -55,3 +69,18 @@ void OmobiDisplayBackend::DataHandler(const QString &s){
QBluetoothLeUart* OmobiDisplayBackend::getBleController() {
return this->ble;
}
OmobiDisplayBackend::OmobiDisplayAppState OmobiDisplayBackend::getState() {
return this->state;
}
void OmobiDisplayBackend::setState(OmobiDisplayAppState state) {
if(state == this->state)
return;
this->state = state;
emit this->stateChanged();
if(this->state == Idle)
this->ble->startScanningForDevices();
}

View file

@ -8,16 +8,27 @@ class OmobiDisplayBackend : public QObject
{
Q_OBJECT
Q_PROPERTY(QBluetoothLeUart* bleController READ getBleController NOTIFY bleControllerChanged)
Q_PROPERTY(OmobiDisplayAppState state READ getState WRITE setState NOTIFY stateChanged)
public:
explicit OmobiDisplayBackend(QObject *parent = nullptr);
Q_INVOKABLE void startScanning();
enum OmobiDisplayAppState {
Idle,
Scanning,
ReadyToConnect,
Connecting,
Connected
};
Q_ENUM(OmobiDisplayAppState)
private:
OmobiDisplayAppState state;
QBluetoothLeUart *ble;
public slots:
QBluetoothLeUart* getBleController();
Q_INVOKABLE void startScanning();
Q_INVOKABLE QBluetoothLeUart* getBleController();
Q_INVOKABLE OmobiDisplayAppState getState();
private slots:
void handleBluetoothStateChange(QBluetoothLeUart::BluetoothLeUartState state);
@ -25,7 +36,10 @@ private slots:
void DataHandler(const QString &s);
void handleBluetoothDeviceConected();
void setState(OmobiDisplayAppState state);
signals:
void stateChanged();
void bleControllerChanged();
};

View file

@ -0,0 +1,194 @@
import QtQuick 2.0
import QtQuick.Controls 2.9
import QtQuick.Layouts 1.0
import de.itsblue.omobidisplayapp 1.0
import de.itsblue.bluetoothleuart 1.0
import QtQuick.Controls.Material 2.0
Page {
id: root
property string statusText
property bool working
ColumnLayout {
anchors {
fill: parent
margins: parent.height * 0.05
topMargin: 0
}
Text {
Layout.preferredWidth: parent.width * 0.6
Layout.preferredHeight: parent.height * 0.1
Layout.alignment: Layout.Center
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
fontSizeMode: Text.Fit
font.pixelSize: 500
minimumPixelSize: 1
text: qsTr("Available devices")
}
ListView {
id: availableDevicesListView
Layout.preferredWidth: parent.width
Layout.fillHeight: true
Layout.alignment: Layout.Center
clip: true
model: backend.bleController.availableDevicesModel
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 200 }
NumberAnimation { property: "scale"; from: 0.9; to: 1; duration: 200 }
}
remove: Transition {
NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 200 }
NumberAnimation { property: "scale"; from: 1; to: 0.9; duration: 200 }
}
spacing: 5
header: ItemDelegate {
id: headerDelegate
width: parent.width
height: implicitHeight * 0.8
topInset: 10
bottomInset: 10
text: root.statusText
onClicked: backend.bleController.startScanningForDevices()
Rectangle {
anchors.fill: parent
anchors.topMargin: 10
anchors.bottomMargin: 10
color: "transparent"
border.color: "lightgrey"
border.width: 3
}
Item {
anchors {
right: parent.right
rightMargin: parent.height * 0.15
verticalCenter: parent.verticalCenter
}
height: (parent.height - 20) * 0.7
width: height
BusyIndicator {
id: busyIndicator
anchors.centerIn: parent
width: parent.width
height: parent.height
opacity: root.working ? 1:0
}
}
}
delegate: ItemDelegate {
width: parent.width
text: name
onClicked: backend.bleController.connectToDevice(device)
Rectangle {
anchors.fill: parent
color: "transparent"
border.color: "lightgrey"
border.width: 3
}
}
}
}
Popup {
id: connectingPopup
property bool shouldBeOpened: false
parent: Overlay.overlay
x: (parent.width - width) / 2
y: (parent.height - height) / 2
closePolicy: Popup.NoAutoClose
dim: true
contentItem: Column {
BusyIndicator {
running: true
}
}
onShouldBeOpenedChanged: {
if(shouldBeOpened)
connectingPopup.open()
else
connectingPopup.close()
}
}
states: [
State {
name: OmobiDisplayBackend.Idle
PropertyChanges {
target: root
statusText: "Tap here to scan"
working: false
}
},
State {
name: OmobiDisplayBackend.Scanning
PropertyChanges {
target: root
statusText: "Scanning..."
working: true
}
},
State {
name: OmobiDisplayBackend.ReadyToConnect
PropertyChanges {
target: root
statusText: availableDevicesListView.model.rowCount() > 0 ? "Please select a device or tap to scan again":"No devices found. Tap to scan again"
working: false
}
},
State {
name: OmobiDisplayBackend.Connecting
PropertyChanges {
target: availableDevicesListView
enabled: false
}
PropertyChanges {
target: root
statusText: "trying to connect..."
working: true
}
}
]
}

View file

@ -0,0 +1,28 @@
import QtQuick 2.0
import QtQuick.Controls 2.9
import QtQuick.Layouts 1.0
import de.itsblue.omobidisplayapp 1.0
import de.itsblue.bluetoothleuart 1.0
Page {
id: root
ColumnLayout {
anchors.fill: parent
anchors.margins: 10
TextField {
id: newTextInput
Layout.fillWidth: true
Layout.preferredHeight: 50
}
Button {
Layout.fillWidth: true
onClicked: {
backend.bleController.sendData(newTextInput.text)
}
}
}
}

View file

@ -0,0 +1,111 @@
import QtQuick 2.12
import QtQuick.Controls 2.0
import QtQuick.Window 2.12
import de.itsblue.omobidisplayapp 1.0
import de.itsblue.bluetoothleuart 1.0
import QtQuick.Controls.Material 2.0
ApplicationWindow {
width: 540
height: 960
visible: true
title: qsTr("Hello World")
Page {
id: app
state: backend.state
onStateChanged: {
console.log("new state: " + state)
}
anchors.fill: parent
header: ToolBar {
Material.background: "white"
Image {
anchors.fill: parent
anchors.margins: parent.height * 0.1
fillMode: Image.PreserveAspectFit
source: "qrc:/omobi.png"
}
}
OmobiDisplayBackend {
id: backend
}
StackView {
id: mainStack
anchors.fill: parent
property Component currentComponent
onCurrentComponentChanged: {
if(currentComponent != currentItem)
mainStack.replace(currentComponent)
}
Component {
id: connectPageComp
ConnectPage {
state: app.state
}
}
Component {
id: connectedPageComp
ConnectedPage {
state: app.state
}
}
}
states: [
State {
name: OmobiDisplayBackend.Idle
PropertyChanges {
target: mainStack
currentComponent: connectPageComp
}
},
State {
name: OmobiDisplayBackend.Scanning
PropertyChanges {
target: mainStack
currentComponent: connectPageComp
}
},
State {
name: OmobiDisplayBackend.ReadyToConnect
PropertyChanges {
target: mainStack
currentComponent: connectPageComp
}
},
State {
name: OmobiDisplayBackend.Connecting
PropertyChanges {
target: mainStack
currentComponent: connectPageComp
}
},
State {
name: OmobiDisplayBackend.Connected
PropertyChanges {
target: mainStack
currentComponent: connectedPageComp
}
}
]
}
}

View file

@ -1,5 +1,7 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
<file>ConnectPage.qml</file>
<file>ConnectedPage.qml</file>
</qresource>
</RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View file

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file>omobi.png</file>
<file>itsblue.png</file>
</qresource>
</RCC>

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<qmt>
<project>
<uid>{53c9b534-ff35-4fc2-bbb2-1ecf37f46c4a}</uid>
<root-package>
<instance>
<MPackage>
<base-MObject>
<MObject>
<base-MElement>
<MElement>
<uid>{3502968e-5cd9-4ab0-b3b9-52d8cd1ec0d3}</uid>
</MElement>
</base-MElement>
<name>test</name>
<children>
<handles>
<handles>
<qlist>
<item>
<handle>
<uid>{ede58291-b8a9-4a30-9631-1771046708c7}</uid>
<target>
<instance type="MCanvasDiagram">
<MCanvasDiagram>
<base-MDiagram>
<MDiagram>
<base-MObject>
<MObject>
<base-MElement>
<MElement>
<uid>{ede58291-b8a9-4a30-9631-1771046708c7}</uid>
</MElement>
</base-MElement>
<name>test</name>
</MObject>
</base-MObject>
</MDiagram>
</base-MDiagram>
</MCanvasDiagram>
</instance>
</target>
</handle>
</item>
</qlist>
</handles>
</handles>
</children>
</MObject>
</base-MObject>
</MPackage>
</instance>
</root-package>
</project>
</qmt>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" ?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="testChart">
</scxml>