sopping the time with the buzzer and offset calculation is now fully working
This commit is contained in:
parent
fb8e80281b
commit
0a4cabc61e
7 changed files with 250 additions and 29 deletions
96
ProgressCircle.qml
Normal file
96
ProgressCircle.qml
Normal file
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,8 +3,8 @@ import QtMultimedia 5.8
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
import QtQuick.Controls 2.2
|
import QtQuick.Controls 2.2
|
||||||
|
|
||||||
Dialog {
|
Popup {
|
||||||
|
id: root
|
||||||
x: startButt.x
|
x: startButt.x
|
||||||
y: startButt.y
|
y: startButt.y
|
||||||
width: startButt.width
|
width: startButt.width
|
||||||
|
@ -20,6 +20,13 @@ Dialog {
|
||||||
NumberAnimation { properties: "scale"; from: 1; to: 0; duration: 500; easing.type: Easing.OutCubic }
|
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 {
|
background: Rectangle {
|
||||||
radius: width * 0.5
|
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 {
|
Column {
|
||||||
anchors.fill: parent
|
id: settings_col
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
ItemDelegate {
|
ItemDelegate {
|
||||||
id: connect_del
|
id: connect_del
|
||||||
anchors.fill: parent
|
width: parent.width
|
||||||
text: "connect"
|
text: _cppBuzzerConn.get("connected")===1 ? "connected to buzzer":"connect to buzzer"
|
||||||
onClicked: {
|
Timer {
|
||||||
// connect_del.enabled = false
|
running: connect_del.scale === 1
|
||||||
// connect_del.text = _cppBuzzerConn.get("offset")
|
repeat: true
|
||||||
// _cppBuzzerConn.connect()
|
interval: 10
|
||||||
// connect_del.enabled = true
|
onTriggered: {
|
||||||
connect_del.text = _cppBuzzerConn.test()
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,4 +85,6 @@
|
||||||
<uses-feature android:name="android.hardware.microphone" android:required="false"/>
|
<uses-feature android:name="android.hardware.microphone" android:required="false"/>
|
||||||
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
BuzzerConn::BuzzerConn(QObject *parent) : QObject(parent)
|
BuzzerConn::BuzzerConn(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
this->networkManager = new QNetworkAccessManager();
|
this->networkManager = new QNetworkAccessManager();
|
||||||
|
|
||||||
this->date = new QDateTime;
|
this->date = new QDateTime;
|
||||||
this->latest_button_pressed = 0;
|
this->latest_button_pressed = 0;
|
||||||
this->connected = false;
|
this->connected = false;
|
||||||
|
@ -10,14 +11,19 @@ BuzzerConn::BuzzerConn(QObject *parent) : QObject(parent)
|
||||||
|
|
||||||
bool BuzzerConn::connect()
|
bool BuzzerConn::connect()
|
||||||
{
|
{
|
||||||
|
qDebug() << "connecting to buzzer...";
|
||||||
QList<double> times = gettimes();
|
QList<double> times = gettimes();
|
||||||
|
qDebug() << times[0];
|
||||||
if(times[0] == 200.0){
|
if(times[0] == 200.0){
|
||||||
this->connected = true;
|
this->connected = true;
|
||||||
this->latest_button_pressed = times[2];
|
this->latest_button_pressed = times[2];
|
||||||
for(int i=0;i<100;i++){
|
for(int i=0;i<100;i++){
|
||||||
calcoffset();
|
this->connection_progress = i;
|
||||||
|
if(!calcoffset()){
|
||||||
|
return(false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
@ -25,11 +31,12 @@ bool BuzzerConn::connect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuzzerConn::calcoffset()
|
bool BuzzerConn::calcoffset()
|
||||||
{
|
{
|
||||||
QList<double> times = gettimes();
|
QList<double> times = gettimes();
|
||||||
if(times[0] == 200.0){
|
qDebug() << times[0];
|
||||||
double offset = date->currentMSecsSinceEpoch() - times[2];
|
if(times[0] == 200.0 && this->connected){
|
||||||
|
double offset = date->currentMSecsSinceEpoch() - times[1];
|
||||||
if(this->latest_offsets.length()>=100){
|
if(this->latest_offsets.length()>=100){
|
||||||
this->latest_offsets.removeFirst();
|
this->latest_offsets.removeFirst();
|
||||||
}
|
}
|
||||||
|
@ -41,10 +48,16 @@ void BuzzerConn::calcoffset()
|
||||||
}
|
}
|
||||||
//this->offset = mem / double(latest_offsets.length());
|
//this->offset = mem / double(latest_offsets.length());
|
||||||
this->offset = latest_offsets[latest_offsets.length()-1];
|
this->offset = latest_offsets[latest_offsets.length()-1];
|
||||||
qDebug() << latest_offsets.length();
|
// qDebug() << latest_offsets.length();
|
||||||
qDebug() << this->latest_offsets;
|
// qDebug() << this->latest_offsets;
|
||||||
qDebug() << latest_offsets[latest_offsets.length()-1];
|
// qDebug() << latest_offsets[latest_offsets.length()-1];
|
||||||
qDebug() << mem / double(latest_offsets.length());
|
// qDebug() << mem / double(latest_offsets.length());
|
||||||
|
qDebug("%20f", this->offset);
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this->connected = false;
|
||||||
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,9 +83,12 @@ QList<double> BuzzerConn::gettimes()
|
||||||
|
|
||||||
bool BuzzerConn::buzzer_triggered()
|
bool BuzzerConn::buzzer_triggered()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if(!this->connected){
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
QList<double> times = this->gettimes();
|
QList<double> times = this->gettimes();
|
||||||
qDebug() << int(this->get("currtime") - this->starttime);
|
if(times[0] == 200.0){
|
||||||
if(times[0] == 200.0 && this->connected){
|
|
||||||
if(times[2] > this->latest_button_pressed){
|
if(times[2] > this->latest_button_pressed){
|
||||||
this->latest_button_pressed = times[2];
|
this->latest_button_pressed = times[2];
|
||||||
|
|
||||||
|
@ -83,6 +99,7 @@ bool BuzzerConn::buzzer_triggered()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
this->connected = false;
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,6 +115,7 @@ bool BuzzerConn::start()
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
this->connected = false;
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,6 +131,15 @@ double BuzzerConn::get(QString key)
|
||||||
else if( key == "currtime") {
|
else if( key == "currtime") {
|
||||||
return(this->date->currentMSecsSinceEpoch());
|
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()
|
QString BuzzerConn::test()
|
||||||
|
@ -135,18 +162,24 @@ ReturnData_t BuzzerConn::senddata(QUrl serviceUrl)
|
||||||
QUrlQuery pdata;
|
QUrlQuery pdata;
|
||||||
QNetworkReply* reply;
|
QNetworkReply* reply;
|
||||||
|
|
||||||
reply = this->networkManager->post(request, pdata.toString(QUrl::FullyEncoded).toUtf8());
|
|
||||||
|
|
||||||
//wait until the request has finished
|
//wait until the request has finished
|
||||||
QEventLoop loop;
|
QEventLoop loop;
|
||||||
|
QTimer timer;
|
||||||
|
|
||||||
|
timer.setSingleShot(true);
|
||||||
|
loop.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
|
||||||
loop.connect(this->networkManager, SIGNAL(finished(QNetworkReply*)), 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();
|
loop.exec();
|
||||||
|
timer.stop();
|
||||||
|
|
||||||
//get the status code
|
//get the status code
|
||||||
QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
|
QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
|
||||||
|
|
||||||
ret.status_code = status_code.toInt();
|
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;
|
ret.status_code = 444;
|
||||||
}
|
}
|
||||||
//get the full text response
|
//get the full text response
|
||||||
|
|
|
@ -20,11 +20,12 @@ class BuzzerConn : public QObject
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit BuzzerConn(QObject *parent = nullptr);
|
explicit BuzzerConn(QObject *parent = nullptr);
|
||||||
Q_INVOKABLE double offset;
|
double offset;
|
||||||
QList<double> latest_offsets;
|
QList<double> latest_offsets;
|
||||||
double latest_button_pressed;
|
double latest_button_pressed;
|
||||||
double starttime;
|
double starttime;
|
||||||
bool connected;
|
bool connected;
|
||||||
|
int connection_progress;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -37,7 +38,7 @@ public slots:
|
||||||
ReturnData_t senddata(QUrl serviceUrl);
|
ReturnData_t senddata(QUrl serviceUrl);
|
||||||
Q_INVOKABLE QList<double> gettimes();
|
Q_INVOKABLE QList<double> gettimes();
|
||||||
Q_INVOKABLE bool connect();
|
Q_INVOKABLE bool connect();
|
||||||
Q_INVOKABLE void calcoffset();
|
Q_INVOKABLE bool calcoffset();
|
||||||
Q_INVOKABLE bool buzzer_triggered();
|
Q_INVOKABLE bool buzzer_triggered();
|
||||||
Q_INVOKABLE bool start();
|
Q_INVOKABLE bool start();
|
||||||
Q_INVOKABLE double get(QString key);
|
Q_INVOKABLE double get(QString key);
|
||||||
|
|
14
main.qml
14
main.qml
|
@ -16,6 +16,7 @@ Window {
|
||||||
|
|
||||||
|
|
||||||
Page {
|
Page {
|
||||||
|
|
||||||
id:root
|
id:root
|
||||||
anchors.fill: parent
|
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 {
|
Timer {
|
||||||
id: running_refresh_timer
|
id: running_refresh_timer
|
||||||
running: root.state === "RUNNING"
|
running: root.state === "RUNNING"
|
||||||
|
@ -56,8 +67,7 @@ Window {
|
||||||
root.last_button_pressed = _cppBuzzerConn.get("lastpressed")
|
root.last_button_pressed = _cppBuzzerConn.get("lastpressed")
|
||||||
console.log(root.startTime);
|
console.log(root.startTime);
|
||||||
console.log(root.buzzer_offset);
|
console.log(root.buzzer_offset);
|
||||||
//root.stoppedTime = ( ( (root.last_button_pressed + root.buzzer_offset) - root.startTime ) / 2 ) / 10
|
root.stoppedTime = (root.last_button_pressed + root.buzzer_offset) - root.startTime
|
||||||
root.stoppedTime = new Date().getTime() - root.startTime
|
|
||||||
time.text = ( root.stoppedTime / 1000 ).toFixed(3) + " sec"
|
time.text = ( root.stoppedTime / 1000 ).toFixed(3) + " sec"
|
||||||
console.log("STOPPED: "+root.stoppedTime)
|
console.log("STOPPED: "+root.stoppedTime)
|
||||||
root.state = "STOPPED"
|
root.state = "STOPPED"
|
||||||
|
|
1
qml.qrc
1
qml.qrc
|
@ -3,5 +3,6 @@
|
||||||
<file>main.qml</file>
|
<file>main.qml</file>
|
||||||
<file>FadeAnimation.qml</file>
|
<file>FadeAnimation.qml</file>
|
||||||
<file>SettingsDialog.qml</file>
|
<file>SettingsDialog.qml</file>
|
||||||
|
<file>ProgressCircle.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
Reference in a new issue