From 0a4cabc61e01f36317a73d40600204591cee280c Mon Sep 17 00:00:00 2001 From: Dorian Zedler Date: Thu, 26 Jul 2018 20:51:46 +0200 Subject: [PATCH] sopping the time with the buzzer and offset calculation is now fully working --- ProgressCircle.qml | 96 ++++++++++++++++++++++++++ SettingsDialog.qml | 100 +++++++++++++++++++++++++--- android-sources/AndroidManifest.xml | 2 + buzzerconn.cpp | 61 +++++++++++++---- buzzerconn.h | 5 +- main.qml | 14 +++- qml.qrc | 1 + 7 files changed, 250 insertions(+), 29 deletions(-) create mode 100644 ProgressCircle.qml diff --git a/ProgressCircle.qml b/ProgressCircle.qml new file mode 100644 index 0000000..cecc11d --- /dev/null +++ b/ProgressCircle.qml @@ -0,0 +1,96 @@ +import QtQuick 2.0 +import QtQml 2.2 + +Item { + id: root + + width: size + height: size + + property int size: 200 // The size of the circle in pixel + property real arcBegin: 0 // start arc angle in degree + property real arcEnd: 270 // end arc angle in degree + property real arcOffset: 0 // rotation + property bool isPie: false // paint a pie instead of an arc + property bool showBackground: false // a full circle as a background of the arc + property real lineWidth: 20 // width of the line + property string colorCircle: "#CC3333" + property string colorBackground: "#779933" + + property alias beginAnimation: animationArcBegin.enabled + property alias endAnimation: animationArcEnd.enabled + + property int animationDuration: 20 + + onArcBeginChanged: canvas.requestPaint() + onArcEndChanged: canvas.requestPaint() + + Behavior on arcBegin { + id: animationArcBegin + enabled: true + NumberAnimation { + duration: root.animationDuration + easing.type: Easing.InOutCubic + } + } + + Behavior on arcEnd { + id: animationArcEnd + enabled: true + NumberAnimation { + duration: root.animationDuration + easing.type: Easing.InOutCubic + } + } + + Behavior on opacity { + NumberAnimation { + duration: 100 + } + } + + Canvas { + id: canvas + anchors.fill: parent + rotation: -90 + parent.arcOffset + + onPaint: { + var ctx = getContext("2d") + var x = width / 2 + var y = height / 2 + var start = Math.PI * (parent.arcBegin / 180) + var end = Math.PI * (parent.arcEnd / 180) + ctx.reset() + + if (root.isPie) { + if (root.showBackground) { + ctx.beginPath() + ctx.fillStyle = root.colorBackground + ctx.moveTo(x, y) + ctx.arc(x, y, width / 2, 0, Math.PI * 2, false) + ctx.lineTo(x, y) + ctx.fill() + } + ctx.beginPath() + ctx.fillStyle = root.colorCircle + ctx.moveTo(x, y) + ctx.arc(x, y, width / 2, start, end, false) + ctx.lineTo(x, y) + ctx.fill() + } else { + if (root.showBackground) { + ctx.beginPath(); + ctx.arc(x, y, (width / 2) - parent.lineWidth / 2, 0, Math.PI * 2, false) + ctx.lineWidth = root.lineWidth + ctx.strokeStyle = root.colorBackground + ctx.stroke() + } + ctx.beginPath(); + ctx.arc(x, y, (width / 2) - parent.lineWidth / 2, start, end, false) + ctx.lineWidth = root.lineWidth + ctx.strokeStyle = root.colorCircle + ctx.stroke() + } + } + } +} diff --git a/SettingsDialog.qml b/SettingsDialog.qml index 630dae7..fdf44d3 100644 --- a/SettingsDialog.qml +++ b/SettingsDialog.qml @@ -3,8 +3,8 @@ import QtMultimedia 5.8 import QtQuick.Window 2.2 import QtQuick.Controls 2.2 -Dialog { - +Popup { + id: root x: startButt.x y: startButt.y width: startButt.width @@ -20,6 +20,13 @@ Dialog { NumberAnimation { properties: "scale"; from: 1; to: 0; duration: 500; easing.type: Easing.OutCubic } } + function delay(delayTime, cb) { + timer = new Timer(); + timer.interval = delayTime; + timer.repeat = false; + //timer.triggered.connect(cb); + timer.start(); + } background: Rectangle { radius: width * 0.5 @@ -51,20 +58,91 @@ Dialog { } } } + + ProgressCircle { + id: prog + property string text: "connecting.." + anchors.centerIn: parent + size: parent.height * 1.03 + //colorCircle: "grey" + opacity: 0 + lineWidth: 5 + + arcBegin: 0 + arcEnd: 0 + + Timer { + running: opacity === 1 + interval: 1 + repeat: true + onTriggered: { + prog.arcEnd = 360 * ( _cppBuzzerConn.get("connection_progress") / 100 ) + } + } + + Label { + id: content + text: parent.text + anchors.centerIn: parent + font.pixelSize: parent.width * 0.1 + + } + } + Column { - anchors.fill: parent + id: settings_col + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right ItemDelegate { id: connect_del - anchors.fill: parent - text: "connect" - onClicked: { -// connect_del.enabled = false -// connect_del.text = _cppBuzzerConn.get("offset") -// _cppBuzzerConn.connect() -// connect_del.enabled = true - connect_del.text = _cppBuzzerConn.test() + width: parent.width + text: _cppBuzzerConn.get("connected")===1 ? "connected to buzzer":"connect to buzzer" + Timer { + running: connect_del.scale === 1 + repeat: true + interval: 10 + onTriggered: { + connect_del.text = _cppBuzzerConn.get("connected")===1 ? "connected to buzzer":"connect to buzzer" + } + } + onClicked: { + root.modal = true + root.closePolicy = Popup.NoAutoClose + prog.colorCircle = "grey" + prog.opacity = 1 + prog.text = "connecting..." + + connect_del.enabled = false + + if(_cppBuzzerConn.connect()){ + prog.arcEnd = 360 + prog.colorCircle = "green" + prog.text = "success!" + } + else { + prog.arcEnd = 360 + prog.colorCircle = "red" + prog.colorBackground = "red" + prog.text = "error!" + } + + //make a short delay and go back to normal options + shortDelay.start() + } + Timer { + id: shortDelay + running: false + repeat: false + interval: 1000 + onTriggered: { + connect_del.enabled = true; + prog.opacity = 0; + root.modal = false; + root.closePolicy = Popup.CloseOnPressOutside; + } } } } diff --git a/android-sources/AndroidManifest.xml b/android-sources/AndroidManifest.xml index c28cb64..bec9b3f 100644 --- a/android-sources/AndroidManifest.xml +++ b/android-sources/AndroidManifest.xml @@ -85,4 +85,6 @@ + + diff --git a/buzzerconn.cpp b/buzzerconn.cpp index 66d7383..1c46fca 100644 --- a/buzzerconn.cpp +++ b/buzzerconn.cpp @@ -3,6 +3,7 @@ BuzzerConn::BuzzerConn(QObject *parent) : QObject(parent) { this->networkManager = new QNetworkAccessManager(); + this->date = new QDateTime; this->latest_button_pressed = 0; this->connected = false; @@ -10,14 +11,19 @@ BuzzerConn::BuzzerConn(QObject *parent) : QObject(parent) bool BuzzerConn::connect() { + qDebug() << "connecting to buzzer..."; QList times = gettimes(); - + qDebug() << times[0]; if(times[0] == 200.0){ this->connected = true; this->latest_button_pressed = times[2]; for(int i=0;i<100;i++){ - calcoffset(); + this->connection_progress = i; + if(!calcoffset()){ + return(false); + } } + return(true); } else{ @@ -25,11 +31,12 @@ bool BuzzerConn::connect() } } -void BuzzerConn::calcoffset() +bool BuzzerConn::calcoffset() { QList times = gettimes(); - if(times[0] == 200.0){ - double offset = date->currentMSecsSinceEpoch() - times[2]; + qDebug() << times[0]; + if(times[0] == 200.0 && this->connected){ + double offset = date->currentMSecsSinceEpoch() - times[1]; if(this->latest_offsets.length()>=100){ this->latest_offsets.removeFirst(); } @@ -41,10 +48,16 @@ void BuzzerConn::calcoffset() } //this->offset = mem / double(latest_offsets.length()); this->offset = latest_offsets[latest_offsets.length()-1]; - qDebug() << latest_offsets.length(); - qDebug() << this->latest_offsets; - qDebug() << latest_offsets[latest_offsets.length()-1]; - qDebug() << mem / double(latest_offsets.length()); +// qDebug() << latest_offsets.length(); +// qDebug() << this->latest_offsets; +// qDebug() << latest_offsets[latest_offsets.length()-1]; +// qDebug() << mem / double(latest_offsets.length()); + qDebug("%20f", this->offset); + return(true); + } + else { + this->connected = false; + return(false); } } @@ -70,9 +83,12 @@ QList BuzzerConn::gettimes() bool BuzzerConn::buzzer_triggered() { + + if(!this->connected){ + return(false); + } QList times = this->gettimes(); - qDebug() << int(this->get("currtime") - this->starttime); - if(times[0] == 200.0 && this->connected){ + if(times[0] == 200.0){ if(times[2] > this->latest_button_pressed){ this->latest_button_pressed = times[2]; @@ -83,6 +99,7 @@ bool BuzzerConn::buzzer_triggered() } } else{ + this->connected = false; return(false); } } @@ -98,6 +115,7 @@ bool BuzzerConn::start() return(true); } else{ + this->connected = false; return(false); } } @@ -113,6 +131,15 @@ double BuzzerConn::get(QString key) else if( key == "currtime") { return(this->date->currentMSecsSinceEpoch()); } + else if( key == "connection_progress") { + return(this->connection_progress); + } + else if( key == "connected") { + if(this->connected){ + return(1); + } + return(0); + } } QString BuzzerConn::test() @@ -135,18 +162,24 @@ ReturnData_t BuzzerConn::senddata(QUrl serviceUrl) QUrlQuery pdata; QNetworkReply* reply; - reply = this->networkManager->post(request, pdata.toString(QUrl::FullyEncoded).toUtf8()); - //wait until the request has finished QEventLoop loop; + QTimer timer; + + timer.setSingleShot(true); + loop.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); loop.connect(this->networkManager, SIGNAL(finished(QNetworkReply*)), SLOT(quit())); + + timer.start(500); + reply = this->networkManager->post(request, pdata.toString(QUrl::FullyEncoded).toUtf8()); loop.exec(); + timer.stop(); //get the status code QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); ret.status_code = status_code.toInt(); - if(ret.status_code == 0){ //if tehstatus code is zero, the connecion to the server was not possible + if(ret.status_code == 0){ //if the statuscode is zero, the connecion to the server was not possible ret.status_code = 444; } //get the full text response diff --git a/buzzerconn.h b/buzzerconn.h index 356bb90..8db5c6b 100644 --- a/buzzerconn.h +++ b/buzzerconn.h @@ -20,11 +20,12 @@ class BuzzerConn : public QObject Q_OBJECT public: explicit BuzzerConn(QObject *parent = nullptr); - Q_INVOKABLE double offset; + double offset; QList latest_offsets; double latest_button_pressed; double starttime; bool connected; + int connection_progress; private: @@ -37,7 +38,7 @@ public slots: ReturnData_t senddata(QUrl serviceUrl); Q_INVOKABLE QList gettimes(); Q_INVOKABLE bool connect(); - Q_INVOKABLE void calcoffset(); + Q_INVOKABLE bool calcoffset(); Q_INVOKABLE bool buzzer_triggered(); Q_INVOKABLE bool start(); Q_INVOKABLE double get(QString key); diff --git a/main.qml b/main.qml index 9eb2201..a39b0e4 100644 --- a/main.qml +++ b/main.qml @@ -16,6 +16,7 @@ Window { Page { + id:root anchors.fill: parent @@ -40,6 +41,16 @@ Window { } } + Timer { + //timer that refreshes the connection state to the buzzer + running: false + repeat: true + interval: 500 + onTriggered: { + console.log(_cppBuzzerConn.calcoffset()) + } + } + Timer { id: running_refresh_timer running: root.state === "RUNNING" @@ -56,8 +67,7 @@ Window { root.last_button_pressed = _cppBuzzerConn.get("lastpressed") console.log(root.startTime); console.log(root.buzzer_offset); - //root.stoppedTime = ( ( (root.last_button_pressed + root.buzzer_offset) - root.startTime ) / 2 ) / 10 - root.stoppedTime = new Date().getTime() - root.startTime + root.stoppedTime = (root.last_button_pressed + root.buzzer_offset) - root.startTime time.text = ( root.stoppedTime / 1000 ).toFixed(3) + " sec" console.log("STOPPED: "+root.stoppedTime) root.state = "STOPPED" diff --git a/qml.qrc b/qml.qrc index 8272b66..4c70231 100644 --- a/qml.qrc +++ b/qml.qrc @@ -3,5 +3,6 @@ main.qml FadeAnimation.qml SettingsDialog.qml + ProgressCircle.qml